c语言中的字符串初始化,内存分配问题,不解,
如下一段代码,打印出来的结果有些困惑,dest的输出为什么超出了11个字节?难道这和野指针有关?如果使用malloc来分配dest的话,就没问题了。不知道怎么解释,欢迎高手解答,呵呵。
main()
{
char src[] = "I come from yunnan";
char dest[11];
printf("sizeof(src) = %d,strlen(src) = %d\n",sizeof(src),strlen(src));
printf("src = 0x%x , src = %s \n",src,src);
printf("dest = 0x%x , dest = %s \n",dest,dest);
}
打印输出结果:
[最优解释]
首先要明确变量声明初始化时候内存分配情况,我用的编译器是vs2010,变量内存的分配原则是先声明的变量在高地址端,后声明的变量在低地址端.然后因为dest只有声明,并没有初始化,所以它输出的是原来内存中的内容,并且注意编译器对数组不做越界检查,dest没有初始化,所以当以%s输出时,编译器不管你原先定义的数组是多大,它只判断是否有'\0',当遇到‘\0’是输出结束,所以就会出现dest输出时在烫烫烫烫等后面输出str的内容的情形。当用malloc是编译器分配内存时,分配的空间大小是固定的,你可以认为此时是有界的,编译器会自动判断边界,即使没有遇到'\0’,只要分配的内存读完后,输出就结束,不会再去读其他内存的内容。
[其他解释]
貌似dest 没结束标志 分配的时候先分配src,再分配dest
他们地址是在一起,你直接打印dest他把自己的内存乱码 和 src的内存都打印出来了
用了src的结束标志
[其他解释]
这个貌似和malloc没什么关系吧,你定义一个char dest[11]的数组用%s输出,它肯定是输出到'\0'字符结束吧,这个dest数组中没有'\0',所以它就一直输出下去超过11个字符也是对的,malloc一个数组应该也是一直输出到'\0'才结束吧。
[其他解释]
我怎么没看见dest 怎么赋值的呀
[其他解释]
dest都没初始化,输出的时候是遇'\0'才结束,
你可以用strlen(dest)看下dest是多大
[其他解释]
我是这样理解的,dest分配的初始地址是0x0x12ff60,由于没有赋值,也就是没有结束标志'\0',这样读取dest地址开始的数据,必要遇到结束标识符才能停止。貌似malloc分配的空间末尾是‘\0’
[其他解释]
%s输入字符串的内容。
dest是字符数组,没有初始化,所以是乱码, %s对其没有意义。
str是数组,也是字符串,因为它以'\0'结束,所以%s对其有意义。
[其他解释]