malloc(及其堂兄弟)返回的内存块是否初始化为零?

前端之家收集整理的这篇文章主要介绍了malloc(及其堂兄弟)返回的内存块是否初始化为零?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我编写了一个代码来测试,以测试Linux和Windows操作系统的内存管理.为了进一步测试,我继续检查malloc()返回的内存中存在哪些值.

返回的值都是0(零).我已经阅读了malloc的手册页,在Windows和Linux上都进行过检查,但是我无法找到这种行为的原因.根据联机帮助页

The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized.

要清除内存段,必须手动使用memset().

#include dio.h>
#include 

也许我错过了什么.
代码改编自here

编辑:问题已经回答here GCC特定输出.我相信Windows操作系统也会遵循相同的程序.

最佳答案
malloc()返回的内存未初始化,这意味着它可能是任何内容.它可能是零,也可能不是; ‘not initialized’意味着它可以是任何东西(包括零).要获得保证归零页面,请使用calloc().

您看到归零页面(无论如何在Linux上)的原因是,如果应用程序请求新页面,这些页面将由操作系统归零(或者更确切地说,它们是固定页面的零写入时的复制写入图像,称为’全球零页’).但是,如果malloc()碰巧使用已经分配给应用程序的内存(此时已经被释放)(而不是扩展堆),您可能会看到非零数据.请注意,操作系统提供的页面归零是特定于操作系统的特征(主要用于安全性,因此一个进程最终不会发生碰巧有来自另一个进程的数据的页面),并且不是C标准强制要求的.

您要求get_free_page将页面归零source:表示’get_free_page()需要一个参数,一个优先级. …它需要关闭free_page_list页面,更新mem_map,将页面归零并返回页面的物理地址. Here的另一篇文章解释得很好,也解释了为什么使用calloc()比malloc()memset()更好.

请注意,您没有将整个分配的块检查为零.你想要这样的东西(未经测试):

int n;
char nonzero=0;
char *buffer=malloc(sizeof(char)*chunk);     
if(buffer==NULL){
    return -1;
}
for (n = 0; n

猜你在找的Linux相关文章