C memset函数导致的未知行为

C memset函数导致的未知行为,c,linux,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=

我正在尝试创建一个消耗内存的二进制文件。 所以,我在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);
    }
}

提前谢谢

所以,我想你真正的问题是“为什么我的程序看起来没有使用内存,除非我添加代码来写入它?”或者其他什么


这是因为内核是懒惰的,希望您的应用程序过度分配。一旦你真正接触到内存,它就必须做一些工作以使内存可用,因此测量的该进程的实际内存使用量随之改变。

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


要使您的程序实际使用该内存,请使用随机、垃圾甚至只是设置的值对其进行写入。

谢谢,如果我想在5月迭代后在while循环中的某个位置使用分配的内存,那么分配的内存将可用或可用not@Ash只要分配成功,系统应能够提供请求的内存。我不认为这是一个100%的保证,这可能取决于内核的政策,但你不“需要”关心。当然,为了以后使用,您必须将指针保存在循环中。感谢您提供任何描述上述行为的链接。如果您在Linux上运行,您应该可以看到MemFree在不接触分配内存的情况下运行。此外,我们还可以看看承诺型(Committed_)AS,无论过度承诺政策如何,它都应该上升。