我在课堂上有这个例子,没有正确的解释:
#include<stdio.h>
#include<stdlib.h>
int main() {
const int dim = 10;
int i, a[dim], *b;
b = (int *)malloc(dim*sizeof(int));
printf("\n Address of a : %x", &a);
printf("\n Address of a[0]: %x", &a[0]);
printf("\n Dimension of a : %d bytes", sizeof(a));
printf("\n Address of b : %x", &b);
printf("\n Address of b[0]: %x", &b[0]);
printf("\n Dimension of b : %d bytes", sizeof(b));
free(b);//free allocated memory
return 0;
}
有人可以解释malloc的这种行为,b与b [0]不同吗?
Address of a : ffffcb90
Address of a[0]: ffffcb90
Dimension of a : 40 bytes
Address of b : ffffcbc0
Address of b[0]: 103a0
Dimension of b : 8 bytes
答案 0 :(得分:4)
b
是一个局部变量,驻留在堆栈上。它的值被解释为指针。
当malloc在(堆)上分配内存时,您将该地址分配给b
,所以现在b
是一个指针(它仍然存储在堆栈中的相同位置),并指向一个数组堆。
b[0]
是该数组中的第一个元素。
相比之下,a
是一个完全在本地分配的数组,因此它完全驻留在堆栈上 - 这使得a
数组本身,所以a[0]
是相同的。尝试将malloc返回值分配给a
,看看会发生什么。
答案 1 :(得分:1)
&b
是名为b
的变量的地址。该变量恰好指向某个数组,但这与此无关。&b[0]
是 b
指向的数组的第一个元素的地址。换句话说,它与b + 0
相同,因此在这种情况下它是b
的值。