【问题标题】:malloc zeroing out memory?malloc 清零内存?
【发布时间】:2010-12-09 23:33:27
【问题描述】:

鉴于这段使用 gcc 4.3.3 编译的 C 代码

#include <stdio.h>
#include <stdlib.h>

 
int main(int argc, char * argv[])
{
 
    int * i;
    
    i = malloc(sizeof(int));
    
    printf("%d\n", *i);
    return 0;
 
}

我希望输出是 malloc() 返回的内存中的任何内容,但输出为 0。malloc 是否将它返回的内存清零?如果有,为什么?

【问题讨论】:

  • 您所期望的就是这种情况。它输出 malloc() 返回的内存中的任何内容,恰好为零。

标签: c malloc


【解决方案1】:

malloc() 函数不会将分配的内存设置为任何特定值。如果要确保内存为零,请使用calloc() 或等效项。否则,你会得到之前的任何东西(在你的情况下,它可能为零)。

【讨论】:

  • 如果它不是始终为 0,我希望如此。为什么我会一遍又一遍地得到始终为 0 的值?
  • 您以同样的方式反复运行同一个程序并期待不同的结果?尽管malloc() 本身不能保证将内存清零,但操作系统正在执行相同的工作来加载您的程序并使其运行。您的运行时库代码正在做同样的事情来设置堆内存并开始运行您的代码。正如另一个答案中提到的那样,操作系统可能会为您提供初始化为某个特定值的新内存页面,以便将不同的进程相互隔离。
  • 您的程序正在向操作系统请求新内存。首次分配给进程时,操作系统会将内存清零。尝试填充随机值,free() 一块,然后分配另一个。
【解决方案2】:

你绝对不能依赖它为 0。 malloc 一个更大的块并转储它以查看。

【讨论】:

    【解决方案3】:

    malloc 本身不会将内存归零,但出于安全原因(以防止一个进程访问另一个进程使用的潜在敏感信息),许多操作系统会将您的程序请求的内存归零。

    【讨论】:

    • 我应该提一下,标准 防止 malloc 将其内存归零。为了效率,它通常不会,但这不是强制性的。
    • 另请注意,虽然来自操作系统的新内存可能会归零,但如果您的应用程序回收它之前使用的内存,则可能不会归零。所以不要考虑依赖这个:)
    • 完全正确,bdonlan。要查看这个 malloc X 字节,将一些信息写入其中,释放它,然后再次 malloc X 字节并读取它。可能是相同的数据。
    • 在调试模式下,malloc 通常会将内存清零。确保您在发布模式下编译。
    • @YochaiTimmer: 好的调试 malloc 用一个保护值填充内存,例如VC++2005 使用 0xFD、0xDD 和 0xCD。
    【解决方案4】:

    分配的内存中的值是官方未定义的。 C99 声明:The malloc function allocates space for an object whose size is specified by size and whose value is indeterminate. malloc() 可以做任何它想做的事情,包括将其归零。这可能是故意的,是实现的副作用,或者您可能只是有很多内存恰好为 0。

    在 OS X 上使用 Apple 的 gcc 4.0.1 的 FWIW 我不能让它出来不是 0 即使做了很多分配:

    for( idx = 0; idx < 100000; idx++ ) {
        i = (int *) malloc(sizeof(int));
        printf("%d\n", *i);
    }
    

    【讨论】:

    • 尝试将 *i 设置为非零,释放 i,然后再次 mallocing 看看你得到了什么。
    • 出于安全原因,第一次分配给您的进程的任何内存都将设置为零,这样您就无法 malloc 内存并找出另一个进程向其写入的信息。
    • @gnasher729 这可能是特定 C 编译器所做的,但无法保证确实如此,不应依赖。
    【解决方案5】:

    Malloc 不必填满内存。出于性能原因,发行版通常不使用内存。 “安全”库可能具有清除内存的 malloc 实现。这取决于图书馆的实施者。有一些常见的模式被各种编译器的调试库填充到内存中,它们是explained in this stackoverflow topic

    【讨论】:

      【解决方案6】:

      是否它的 int;整数=0;或int = 00000000;它会占用内存中的相同空间。 printf 通常会将第一个 0 捕获为空终止符,而不管字符串中还有什么。如果您使用字符串比较器并且 0 是占位符,我建议您使用 ANYTHING 但 0 作为该占位符,因为基于字符串的库真的很烂。尝试 F,然后根据需要在自己的控件中插入 null 术语或换行符,这样会更便携。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-21
        • 2011-01-16
        • 1970-01-01
        • 2015-12-24
        • 2023-03-30
        • 1970-01-01
        • 2010-12-02
        • 2012-12-26
        相关资源
        最近更新 更多