【发布时间】:2018-05-28 21:58:30
【问题描述】:
我已经尽我所能研究了所有可能的方式,但我很难消化两个 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 的看法。我可能对或错,但请告诉我任何一种方式。
【问题讨论】:
-
malloc(sizeof(10)) 和 calloc 即 calloc(2,sizeof(5)) 分配相同的传染性内存 - 这完全是错误的。也许你的意思是
malloc(10)和calloc(2,5)? -
这些函数的确切行为由实现定义。它可以做你所说的,或者完全不同的事情。从 C 开发人员的角度来看,这并不重要。
-
@EugeneSh。没错。
-
"calloc initializes to zero and works relatively slower"- “相对较慢” 可以忽略不计,在分配数组等的几乎所有情况下,防止从未初始化的无意读取的好处由于所有字节初始化为零,value far out 对分配速度的任何相对差异进行加权。 -
C 库接口按照文档说明的方式工作。您的愿望、信念和审美判断不会改变行为。
标签: c pointers memory memory-management dynamic-memory-allocation