|
1
1
简而言之,(那一次)它之所以奏效,是因为你很幸运。超出数组末尾的写入是 未定义的行为 哪里 未定义的行为 就是这样, 未定义 ,它很容易导致分割错误,因为它会产生输出。(尽管通常会导致堆栈损坏)
在C中处理字符数组时,
你
负责确保您分配了足够的存储空间。当您打算将数组用作字符串时,还必须为
每个字符
为什么它有效?通常,当你要求时,说
或者,你很幸运
重点是,你要求
在C语言中,确保代码、存储和内存使用完全由您负责 定义明确的 而且你不会迷失在 未定义 ,因为如果你这样做,所有的赌注都会被打掉,你的代码不值得它所存储的字节。
您如何编写代码
定义明确的
? 适当地限制和验证代码中的每个必需步骤。对于代码段,可以使用
现在,您可以依赖
|
|
|
2
0
您的代码有一些内存问题(缓冲区溢出)
|
|
|
3
0
这段代码的行为没有保证。 就像:你告诉我“我下午5点来接你”,你来的时候我会在那里(保证)。但我不能保证我是否给你带了一杯咖啡,因为你没有告诉我你想要一杯。也许我很好,买了两杯咖啡,或者我是个小气鬼,只给自己买了一杯。 |
|
4
0
它可能会起作用。可能不会。它可能会立即明显失败。它可能会在未来的某个时候以微妙的方式失败,这会让你发疯。 这就是未定义行为的阴险性质。不要这样做。
如果它真的有效,那完全是偶然的,没有任何保证。它是
可能的
覆盖堆栈或其他内存中的内容(取决于实现和实际变量的方式/位置
它可能在 不 这种方式使它成为一个好主意。
对于我们当中的语言律师
那个
提供有用信息的
截面参考
(a)
例如,在我的系统中,在内部声明变量
但是,如果我将声明放在文件级别(
但我向你保证,这只是因为你扔掉的内存对程序的继续不重要 在这种情况下。 几乎可以肯定,它在任何比这个例子更重要的事情上都是重要的。 |
|
|
5
-1
只要printf放在strcpy后面,代码就始终可以工作。但这是错误的编码
尝试跟随,但它不会起作用
|