memset函数导致的未知行为

时间:2016-04-29 09:06:25

标签: c linux

我正在尝试创建一个吃二进制文件的内存。 所以,我在while循环中使用malloc在一次迭代中分配1MB。

我发现一些未知行为,如果我只是使用malloc分配内存,那么/ proc / meminfo中的MemFree没有按预期减少。

如果我分配内存并做一些memset,那么/ proc / meminfo中的MemFree正在正常减少。

以下是代码:

int main()
{
char *temp,*cmd="cat /proc/meminfo | grep MemFree";
    int i=0;

    while(1)
    {
    temp=malloc(1024*1024);
    //memset(temp,1,1024*1024);  //If not commented then MemFree is updated properly
    if(temp == NULL)
        printf("failed \n");
    else printf("allocated %d   %x MB\n",++i,(unsigned int)temp);
    temp=temp;
    system(cmd);
    usleep(1000*700);
    }
}

先谢谢!!

2 个答案:

答案 0 :(得分:2)

所以,我猜你的实际问题是"为什么看起来我的程序不使用内存,除非我添加代码写入它?"什么的。

这是因为内核很懒,希望你的应用程序过度分配。实际触摸内存后,它必须完成工作以使内存可用,因此该过程的实际内存使用量会随之改变。

答案 1 :(得分:2)

简单地分配内存并不意味着内核会为您的程序保留那么多物理内存。由于过度分配的做法,许多应用程序经常犯这样的错误,内核只是假设除非你当前正在写或从该内存中读取,否则你实际上并不需要它。

要让你的程序实际使用那个内存,让它随机写入,垃圾甚至只是设置值。