malloc(和它的表兄弟)返回的内存块是否初始化为零?

malloc(和它的表兄弟)返回的内存块是否初始化为零?,第1张

概述malloc(和它的表兄弟)返回的内存块是否初始化为零?

我写了一个代码来testing,以强调testinglinux和windows *** 作系统的内存pipe理。 为了进一步testing,我继续检查malloc()返回的内存中存在的值。

正在返回的值全部为0(零)。 我已经阅读了malloc的手册页,在windows和linux上都检查过了,但是我找不到这种行为的原因 。 根据手册

malloc()函数分配大小字节并返回指向已分配内存的指针。 内存不被初始化。

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

使用C ++查找RAM的数量

什么是tomcat内存堆提交?

扩展大型本地数据处理的堆栈大小是一个好主意吗?

如何在linux中每5秒钟查找一个特定进程的内存消耗量

*** 作系统中的共享内存段

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <stdbool.h> int eat(long total,int chunk){ long i; for(i=0;i<total;i+=chunk){ short *buffer=malloc(sizeof(char)*chunk); if(buffer==NulL){ return -1; } printf("nDATA=%d",*buffer); memset(buffer,chunk); } return 0; } int main(int argc,char *argv[]){ int i,chunk=1024; long size=10000; printf("Got %ld bytes in chunks of %d...n",size,chunk); if(eat(size,chunk)==0){ printf("Done,press any key to free the memoryn"); getchar(); }else{ printf("ERROR: Could not allocate the memory"); } }

也许我错过了一些东西。 代码是从这里改编的

编辑:问题已被回答在这里为GCC特定的输出。 我相信windows *** 作系统也将遵循相同的程序。

为什么在RedHat 6.2的setuID可执行文件的内存中加载`LD_PRELOAD`指定的string?

在静态库中查找静态分配的数据块

有没有什么API来确定linux中的虚拟地址的物理地址?

原生应用程序的初始内存占用空间较大

使用C用户空间代码读取linux / proc接口的最佳方法是什么?

malloc()返回的malloc()没有被初始化,这意味着它可能是任何东西。 它可能是零,也可能不是; “未初始化”意味着它可以是任何东西(包括零)。 为了得到一个保证零页面使用calloc() 。

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

您要求get_free_page将页面get_free_page零的源代码 :即get_free_page()取一个参数,一个优先级。 …它从free_page_List取出一个页面,更新mem_map , free_page_List 页面并返回页面的物理地址。 这里有另外一个解释它的帖子,也解释了为什么使用calloc()比malloc() + memset()更好。

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

int n; char nonzero=0; char *buffer=malloc(sizeof(char)*chunk); if(buffer==NulL){ return -1; } for (n = 0; n<chunk; n++) nonzero = nonzero || buffer[n]; printf("nDATA=%sn",nonzero?"nonzero":"zero");

你绝对正确 这个行为不是由C语言标准保证的。

你正在观察的可能只是偶然(你只是在每个分配中检查几个字节),或者它可能是你的 *** 作系统和C运行时库如何分配内存的人为因素。

有了这个声明:

printf("nDATA=%d",*buffer);

你只检查刚刚被malloc() 'ed(通常是两(2)字节)的第一个sizeof(short)的字节数量。

此外,第一次你可能会得到所有的零,但是在你的程序执行(并使用)堆内存之后, malloc()之后的内容将是不确定的。

内存分配函数:calloc()将返回一个指向“新区域”的指针,并将所有字节设置为零。

内存分配函数:realloc()将返回一个指向(可能是新的)区域的指针,并从旧区域复制字节。 新的地区将是“新的”要求的长度

内存分配函数malloc将返回一个指向新区域的指针,但不会将字节设置为任何特定值

正在返回的值全部为0(零)。

但是这并不能保证。 这是因为你只是在运行你的程序。 如果你malloc,随机填充和释放很多,你会开始注意到以前释放的内存正在被重用,所以你将开始在你的malloc中获得非零块。

是的你是正确的malloc()不会零初始化值。 它任意调用从堆中分配的内存量,这意味着可能已经存在任何内存。 因此,您应该只使用malloc(),只要您确定即可将其设置为某个值。 如果你打算用它来做算术运算,你可能会得到一些可怕的结果(我已经有几次亲身经历过这个;你将会有功能性的代码, 有时会出现疯狂的输出)。

因此,使用memset()将你没有设置的值设置为零。 或者我的建议是使用calloc() 。 除了malloc以外,Calloc不会初始化值。 而就我所知,比malloc()和memset()的组合更快,另一方面,malloc本身比calloc快。 所以试着通过保持你在形式上的记忆来找到可能的最快版本。

在这里看看这个帖子: MPI矩阵向量乘法返回有时正确有时奇怪的值 。 问题是一个不同的问题,但原因是一样的。

总结

以上是内存溢出为你收集整理的malloc(和它的表兄弟)返回的内存块是否初始化为零?全部内容,希望文章能够帮你解决malloc(和它的表兄弟)返回的内存块是否初始化为零?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存