我想知道当我使用指针来声明我的结构时如何分配内存。
struct car{
int id;
int age;
};
所以如果我是对的,对于大多数编译器来说,结构大小是8个字节,因为int(4B)x 2 = 8B。
现在我不明白。
//1
struct car *ptr = malloc(sizeof(struct car));
//2
char buffer[4090];
struct car *ptr = buffer;
//3
struct car *ptr = malloc(1);
在这3个案例中,*ptr
的大小为8 sizeof(*ptr)
。为什么?
它是如何在记忆中表现出来的?
答案 0 :(得分:2)
sizeof(something)
在内存中没有任何代表。它是在编译时确定的。
由于ptr
被声明为car*
,sizeof(*ptr)
对于编译器来说是car structure
的大小。
这不取决于ptr的值或它指向的位置,即使它是null。
另一方面,sizeof(ptr)
(没有星号)是指针的大小,这取决于系统(即Win 64位上的8字节)。在这种情况下,指针对象的类型无关紧要。
答案 1 :(得分:0)
表达式*ptr
的类型是struct car,你自己算是8。
至于为什么所有三种情况表示sizeof(*ptr)
的大小为8:在所有三种情况下,C都认为你的ptr
变量是指向汽车的指针结构,由你声明。因此它不能以不同方式处理这3种不同的ptr变量,也不会以不同方式处理* ptr。无论是单个汽车项目(1个案例),还是阵列中的许多项目(第二个案例),或者确实是一个完全损坏的一个字节长的内存,甚至不是完整的汽车结构(第3个案例)情况)。
C信任程序员,以确保指向的任何内容实际上都存在。