[英]Just curiosity, why does this not cause a seg fault?
因此,据我了解,一个C字符串(例如“ 0123456789”)实际上将占用11个字符的数组,主体为10个字符,而终止为null的一个字符。 如果是这样,那么为什么下面的代码不会引起某种错误?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv){
char * my_string = "0123456789";
/* my string should occupy 11 bytes */
int my_len = strlen(my_string);
/* however, strlen should only return 10,
because it does not count the null byte */
char * new_string = malloc(my_len);
/* allocate memory 10 bytes wide */
memcpy(new_string, my_string, my_len);
/* copy the first 10 bytes from my_string to new_string
new_string should NOT be null terminated if my understanding
is correct? */
printf("%s\n", new_string);
/* Since new_stirng is NOT null terminated it seems like this should
cause some sort of memory exception.
WHY DOES THIS NOT CAUSE AN ERROR?
*/
return 0;
}
由于new_string
不是以null结尾的,所以我希望printf
永远读下去,直到到达其他应用程序的内存,或者在某个位置随机放置0x00并崩溃或打印出奇怪的东西。 这是怎么回事?
您已经创建了未定义的行为 。 该行为取决于编译器和平台。 可能会崩溃。 它可以工作。 它可能使您敬酒。 它可能会使您的计算机崩溃,并吸收太阳系。
在您的情况下, new_string[11]
处的内存可能已经为0
,即为'\\0'
或终止空字符。
因为它是未定义的行为。 未定义的行为并不意味着段错误,尽管这是一种可能。
在您的情况下,从malloc获得的特定内存块之前(程序)从未使用过,并且在分配时可能由OS初始化为零。 因此,第11个字节可能为零,因此没有错误。 在运行时间更长的程序中,malloc可以返回第11个字节不为0的脏内存块,因此您将在printf语句中遇到问题。 在实践中,如果分配的区域的末尾没有null,则将打印垃圾(直到遇到第一个null)。
(正如其他人所说,行为在形式上是不确定的,我只是在解释您所看到的)。
或在某处随机放置的0x00 ...打印一些奇怪的东西。
这是通常观察到的行为。 实际发生的情况是不确定的。
这是未定义的行为。 在某些情况下,它可能导致崩溃,这取决于我想像的内存布局
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.