malloc() 和 calloc() 是否正确?

Is this is correct about malloc() and calloc()?

我已经尽我所能研究了所有可能的方法,但我很难理解这两个 malloc 即 malloc(sizeof(10)) 和 calloc 即 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 的看法。我可能是对的,也可能是错的,但请告诉我。

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

无法确切地说出您得到了多少。只是你至少得到了你所要求的保证,如果你不保证,你将得到一个空指针。

不过请注意,使用 get 我的意思是您得到了您所要求的,而且您永远不能指望更多。那将是未定义的行为。

calloc 在数组元素之间分配 "memory for an array of nmemb elements of size bytes each" (Linux man page), but we know that arrays in C cannot have padding,它们在内存中必须是连续的。另一方面,malloc 分配“ size 字节”,所以 malloc(10)calloc(2,5) 中的任何一个都会给你这十个字节。

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

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