内存对齐和分配与malloc

时间:2011-06-21 20:41:44

标签: c malloc

我在C中编写一个库函数,它将返回32位的块。我正在使用malloc()来达到这个目的。下面是否总能保证以连续的方式分配32位内存?

char *base_ptr = (char*)malloc(4*sizeof(char))?

如何确保分配超过4字节边界?

5 个答案:

答案 0 :(得分:3)

是。您将获得一个 4字节内存的连续块。

不是32个字节。如果你的意思是32位,那么这是不可保证的,但在典型的台式机上CHAR_BIT是8然后,是的,你的4个字节相当于32位。

答案 1 :(得分:2)

是的它将是连续的 - 但它不必在4字节边界上分配。

答案 2 :(得分:1)

那是4个字节。如果您希望32个字节是连续的,那么您应该将4更改为32。

无法保证一个malloc调用在下一个实际执行pad块之后连续分配。

答案 3 :(得分:1)

sizeof(char)始终为1。根本没有理由在你的代码中写这个。转换malloc()的返回值也被许多人认为是不好的风格。

如果你需要尽可能接近32位(最小开销)并且你希望非常可移植它,你可能想要这样的东西:

char *base_ptr = malloc((32 + CHAR_BIT - 1) / CHAR_BIT);

答案 4 :(得分:0)

在标题中解决“对齐”一词。

标准malloc不保证返回的分配的对齐方式。特定实现可能会或可能不会在该领域中做有用的事情,并且可能具有或不具有某种扩展,以允许您控制返回的块的对齐。但是,这些东西都不便携。

正如其他人所说,每项拨款都保证是连续的,至少与你要求的一样大;但是不能保证任何一对分配的相对定位。也没有一种可移植的方法来发现实际分配的大小,这使得访问超出请求大小的内存不安全和未定义(同样,一些实现可能提供解决这些问题的扩展)。