为什么malloc在" b"上提供不同的地址?和" b [0]"?

时间:2017-01-21 19:22:57

标签: c pointers malloc

我在课堂上有这个例子,没有正确的解释:

#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

2 个答案:

答案 0 :(得分:4)

b是一个局部变量,驻留在堆栈上。它的值被解释为指针。 当malloc在(堆)上分配内存时,您将该地址分配给b,所以现在b是一个指针(它仍然存储在堆栈中的相同位置),并指向一个数组堆。

b[0]是该数组中的第一个元素。

相比之下,a是一个完全在本地分配的数组,因此它完全驻留在堆栈上 - 这使得a数组本身,所以a[0]是相同的。尝试将malloc返回值分配给a,看看会发生什么。

答案 1 :(得分:1)

  • &b名为b的变量的地址。该变量恰好指向某个数组,但这与此无关。
  • &b[0] b指向的数组的第一个元素的地址。换句话说,它与b + 0相同,因此在这种情况下它是b的值。