加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:08:45 所属栏目:Linux 来源:网络整理
导读:我编写了一个代码来测试,以测试Linux和Windows操作系统的内存管理.为了进一步测试,我继续检查malloc()返回的内存中存在哪些值. 返回的值都是0(零).我已经阅读了malloc的手册页,在Windows和Linux上都进行过检查,但是我无法找到这种行为的原因.根据联机帮助页

我编写了一个代码来测试,以测试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 

也许我错过了什么.
该代码改编自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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读