我正在用C编写一个库函数,它将返回32位的块。我使用malloc()来达到这个目的。以下内容是否总是保证以连续的方式分配了32位内存?
char *base_ptr = (char*)malloc(4*sizeof(char))?
如何确保它被分配到4字节的边界上?
是。您将获得一个连续的4字节内存块。
不是32字节。如果你的意思是32位,那么这是不保证的,但在典型的台式机上,CHAR_BIT
是8,然后,是的,你的4个字节等于32位。
是的,它是连续的,但不需要在4字节的边界上分配。
这是4个字节。如果您希望32个字节是连续的,那么您应该将4更改为32。
不能保证一个malloc调用在下一个(实际上是实现)pad块之后连续分配。
sizeof(char)
始终为1
。根本没有理由把它写在代码中。铸造malloc()
的返回值也被许多人认为是糟糕的风格。
如果你需要尽可能接近32位(最小开销),并且你想让非常可移植,你可能想要这样的东西:
char *base_ptr = malloc((32 + CHAR_BIT - 1) / CHAR_BIT);
对标题中的单词"alignment"进行寻址。
标准malloc
不能保证返回的分配的一致性。特定的实现可能会也可能不会在该领域中起到帮助作用,也可能会有或没有某种扩展来允许您控制返回的块的对齐。然而,这些东西是不可移植的。
正如其他人所说,每个分配都保证是连续的,至少和你要求的一样大;但是不能保证任何一对分配的相对定位。也没有一种可移植的方法来发现实际分配的大小,这使得访问超过请求大小的内存是不安全和不明确的(同样,一些实现可能提供解决这些问题的扩展)。