【问题标题】:Do I have to call memset after I allocated new memory using malloc使用 malloc 分配新内存后是否必须调用 memset
【发布时间】:2012-11-04 19:43:33
【问题描述】:
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
int main(int argc, char* argv[])
{
    int *test = malloc(15 * sizeof(int));
    for(int i = 0;i < 15 ;i  ++ )
        printf("test is %i\n",test[i]);

    memset(test,0,sizeof(int) * 15);

    for(int i = 0 ; i < 15; i ++ )
        printf("test after memset is %i\n",test[i]);

    return 0;
}

我得到的输出很奇怪:

    test is 1142126264
    test is 32526
    ...
    test is 1701409394
    test is 1869348978
    test is 1694498930
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    ...
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0
    test after memset is 0

为什么会这样? 我以为我刚刚malloced 了一些可以使用的新记忆?

那么这个怎么样:

int test[15];

我需要打电话吗 memset(&amp;test,0,sizeof(int) * 15);?

【问题讨论】:

  • 初始化每一位内存会减慢不需要它的程序。如果您需要将其归零,我认为calloc 会起作用。

标签: c malloc memset


【解决方案1】:

当您从堆请求内存时,堆只会分配任何可用的内存块。这块内存可能有一些数据取决于之前的写入。

【讨论】:

    【解决方案2】:

    malloc 不会初始化它分配的内存。你只会得到那里已经存在的任何随机垃圾。如果您确实需要将所有内容设置为 0,请使用 calloc 以降低性能。 (如果您需要初始化为 0 以外的值,请使用 memset 表示字节数组,否则手动循环遍历数组以对其进行初始化。)

    【讨论】:

    • 为什么 malloc+memset 比 calloc 快?
    • 它可能不会更快,但您可以初始化为任何值,而不仅仅是零。
    • @1'' 仅适用于字节数组。您不应该使用 malloc 将 ints 的数组初始化为 0 以外的任何值
    • @CiprianTomoiagă 从技术上讲,如果您要立即填充该数组,那么 malloc() 垃圾不会成为问题。
    【解决方案3】:

    出于性能原因,malloc() 不保证新分配内存的内容。它可能是零,它可能是随机数据,它可能是任何东西。如果您希望 malloc 的内存具有特定值,则由您决定。

    【讨论】:

      【解决方案4】:

      C11 7.22.3.4

      void *malloc(size_t size);
      

      malloc 函数为 size 为 由大小指定,其值是不确定的。

      如果您希望将值设置为零,请改用calloccalloc 基本上只是一个对malloc 的调用和对memset 的调用(设置值为0)的包装函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-19
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        相关资源
        最近更新 更多