当我在C中声明结构的指针时,如何分配内存

时间:2016-12-18 00:32:40

标签: c pointers memory-management struct allocation

我想知道当我使用指针来声明我的结构时如何分配内存。

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)。为什么? 它是如何在记忆中表现出来的?

2 个答案:

答案 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信任程序员,以确保指向的任何内容实际上都存在。