这是关于malloc()和calloc()的正确吗?

时间:2017-12-14 18:10:33

标签: c pointers memory memory-management dynamic-memory-allocation

我已经研究过所有可能的方法,但我很难消化malloc即{。} {}的事实。 和calloc ie calloc(2,sizeof(5))分配相同的连续内存,忽略calloc初始化为零的其他事实,并且工作速度比malloc慢。所以这就是我的想法。

我认为在32位系统上,如果我们调用malloc并说malloc(sizeof(10))那么malloc将进入堆并分配12个字节的内存,因为对于32位系统,内存包被安排在4个字节的组,以便分配10个字节,需要3个块,最后一个块中填充2个字节。

类似地,如果我们调用calloc并说calloc(2,sizeof(5))那么它将分配2个块,每个块大小为8个字节,总共16个字节,因为由于相同的原因,内存在4个字节的包中并且分配使用5个字节,两个4字节的块,在一个块中,将提供3个字节的填充。

所以这就是我对malloc和calloc的看法。我可能是对或错但请告诉我。

2 个答案:

答案 0 :(得分:6)

calloc为每个" size 字节的 nmemb 元素数组分配"内存。 (Linux man page),但我们知道数组元素之间的arrays in C cannot have padding,它们必须在内存中是连续的。另一方面,malloc分配" size 字节",因此malloc(10)calloc(2,5)中的任何一个都会为您提供这10个字节。

现在,幕后发生的事情是另一个问题,C库可能会决定分配12,16或42个字节。但是你不能一定不能指望它。如果你要求10个字节,假设你有10个字节。

malloc(sizeof(10))不同,它占用int的内存大小(因为10int),并分配了那么多。

答案 1 :(得分:1)

使用这两种方法时得到的是至少您请求的内存量。它可以更多。一个原因可能是你提到的那个。另一个原因可能是你得到了更大的块,以防你以后想要改变它。

没有办法确切地说你得到了多少。只有你至少保证你所要求的,如果你没有,你将得到一个空指针。

请注意,使用获取,我的意思是说你得到了你所要求的东西,而且你永远不能指望更多。这将是未定义的行为。