Malloc-动态内存分配

时间:2015-10-11 12:55:23

标签: c memory-management

代码:

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个字节。为什么会这样?

2 个答案:

答案 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)。

相关问题