我尝试运行以下代码:
int main(){
char *ptr = (char*)malloc(sizeof(char)*20);
ptr[5] = 'W';
ptr[0] = 'H';
std::cout<<ptr<<std::endl;
return 0;
}
当我使用GCC 4.3.4时,我得到“H”作为输出。 Kernighan&amp; amp;的书 C Programming Language Ritchie说malloc()返回未初始化的空间,在这种情况下输出应该是一些未定义的值。我的输出只是ptr [1]是'\ 0'的巧合的结果吗?
答案 0 :(得分:3)
是的,这只是巧合。不要依赖它。
答案 1 :(得分:2)
这可能是巧合,或者它可能是您的特定系统的内存分配器的一个功能,它肯定不是初始化动态分配的内存的语言或库要求。
不要将非确定性与随机混淆,即使内存未初始化,该字节为零的可能性也可能大于1/256到期典型的内存使用模式。例如,在ptr
上的调试器中打开一个内存窗口,并在任一方向上滚动相邻的内存,你可能会看到零而不是很多。
答案 2 :(得分:1)
它的平台(和编译模式)依赖,例如在调试编译中可能会填充一些模式,如0x55 0xaa 0x55,在生产中你可能会得到0x00-s,或任何内存垃圾。 所以是的,你可以宣布它是一个巧合。 您可能很容易出现总线错误(或无效的内存访问),因为您的字符串并不总是被终止。
答案 3 :(得分:0)
是。但是在术语中要小心,ptr [1]是int 0,而不是指针。