我在课堂上有这个例子,给出了一个适当的解释:
#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
b
是一个局部变量,驻留在堆栈上。其值被解释为指针。当 malloc 在(堆)上分配内存时,您将该地址分配给b
所以现在b
是一个指针(它仍然存储在堆栈上的同一位置),并指向堆上的数组。
b[0]
是该数组中的第一个元素。
相比之下,a
是一个完全在本地分配的数组,因此它完全驻留在堆栈上 - 这使得数组本身a
,因此a[0]
是相同的。尝试将 malloc 返回值分配给a
,看看会发生什么。
-
&b
是名为b
的变量的地址。该变量恰好指向某个数组,但这在这里无关紧要。 -
&b[0]
是b
指向的数组第一个元素的地址。换句话说,它与b + 0
相同,因此在这种情况下它是b
的值。