代码:
int *a;
char *b;
float *c;
short*d;
a = malloc(10* sizeof(int));
b = malloc(10 * sizeof(char));
c = malloc(16 * sizeof(float));
d = malloc(32 * sizeof(short));
printf("\n a:%d b:%d c:%d d:%d", a, b, c, d);
当我执行程序时,我可以理解每个malloc彼此不同的一些字节(在内存中分配时)。谁能解释为什么会这样? 例如,第一和第二malloc相差80个字节。第二个和第三个不同的是24个字节。为什么会这样?
答案 0 :(得分:1)
无法保证多个malloc
对象在内存中是连续的;取决于堆的碎片程度,堆管理器如何进行内部簿记,是否使用" first fit"或者"最合适的"算法,对齐要求等,两个连续分配的对象可能彼此不相邻。
答案 1 :(得分:0)
malloc
返回的值未指定;它们取决于特定的malloc
实施。
一些简单的实现使用链表,一些更高级的使用不同大小的存储桶,有些是最接近某个大小的倍数。
因此,您不能依赖于两个连续malloc
返回值之间的任何特定“差异”。你为什么要这样?
首先请注意,mallocing数组的最佳实践是将元素数乘以指针指向的数,即
a = malloc(10 * sizeof *a);
b = malloc(10 * sizeof *b);
c = malloc(16 * sizeof *c);
d = malloc(32 * sizeof *d);
这样您就可以在不触及malloc
参数的情况下更改类型。
注意第二,指针的printf格式说明符是%p
,并且参数必须强制转换为(void *)
(除非它已经是ptr-to-void)。