2015-10-11 43 views
-2

代码:malloc的-动态存储器分配

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); 

当我执行PROGRAMM,我可以理解,每一个的malloc从一个不同另一个一些字节(在存储器中分配时)。谁能解释为什么会发生这种情况? 例如,第一个和第二个malloc不同80个字节。第二个和第三个不同的是24个字节。为什么发生这种情况?

+1

'%d'是指针的错误格式。 '%d'接受一个'int'。要打印一个指针,你需要'printf(“%p”,(void *)ptr)''。 – melpomene

+0

指针是不同的,因为你不能在同一个内存位置存储多个值。 – melpomene

+0

既不是你打印的是清晰的,也不是你的问题。你只是打印一个随机值,你的意图不明确。 – milevyo

回答

1

不能保证多个malloc的d对象在内存中是连续的;取决于堆的分散程度,堆管理者如何进行内部簿记,无论是使用“第一个适合”算法还是“最佳拟合”算法,对齐要求等,两个连续分配的对象可能远不及彼此靠近。

0

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-void)。