【问题标题】:Was I just lucky that malloc returned a zero-filled buffer?我只是幸运 malloc 返回了一个零填充的缓冲区吗?
【发布时间】:2011-11-19 17:15:08
【问题描述】:

我尝试运行以下代码:

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 & Ritchie 的C 编程语言一书说 malloc() 返回未初始化的空间,在这种情况下,输出应该是一些未定义的值。我的输出只是 ptr[1] 为 '\0' 巧合的结果吗?

【问题讨论】:

  • This 可能适合您阅读。
  • sizeof(char) 根据定义始终为1。

标签: c++ memory-management malloc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    是的。但要注意术语,ptr[1] 是 int 0,而不是指针。

    【讨论】:

    • 感谢您的指正。空终止是我猜的正确词。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      不要把 non-deterministic 和 random 混为一谈,即使内存未初始化,那个字节为 0 的几率也可能远大于 1/256,因为典型的内存使用模式。例如,在ptr 上的调试器中打开一个内存窗口并在任一方向滚动相邻的内存,您很可能会看到很多零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 2013-06-12
        相关资源
        最近更新 更多