c语言 - 为什么 malloc 在 "b" 和"b[0]"上给出不同的地址?



我在课堂上有这个例子,给出了一个适当的解释:

#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 的值。

相关内容

  • 没有找到相关文章