我很幸运,malloc返回了一个零填充缓冲区?

时间:2011-09-18 15:27:16

标签: c++ memory-management malloc

我尝试运行以下代码:

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'的巧合的结果吗?

4 个答案:

答案 0 :(得分:3)

是的,这只是巧合。不要依赖它。

答案 1 :(得分:2)

这可能是巧合,或者它可能是您的特定系统的内存分配器的一个功能,它肯定不是初始化动态分配的内存的语言或库要求。

不要将非确定性随机混淆,即使内存未初始化,该字节为零的可能性也可能大于1/256到期典型的内存使用模式。例如,在ptr上的调试器中打开一个内存窗口,并在任一方向上滚动相邻的内存,你可能会看到零而不是很多。

答案 2 :(得分:1)

它的平台(和编译模式)依赖,例如在调试编译中可能会填充一些模式,如0x55 0xaa 0x55,在生产中你可能会得到0x00-s,或任何内存垃圾。 所以是的,你可以宣布它是一个巧合。 您可能很容易出现总线错误(或无效的内存访问),因为您的字符串并不总是被终止。

答案 3 :(得分:0)

是。但是在术语中要小心,ptr [1]是int 0,而不是指针。