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

当我在C中声明一个结构的指针时,内存是如何分配的,c,pointers,memory-management,struct,allocation,C,Pointers,Memory Management,Struct,Allocation,我想知道当我使用指针声明我的结构时,内存是如何分配的 struct car{ int id; int age; }; 如果我是对的,对于大多数编译器,结构大小是8字节,因为int(4B)x2=8B 现在我不明白这一点 //1 struct car *ptr = malloc(sizeof(struct car)); //2 char buffer[4090]; struct car *ptr = buffer; //3 struct car *ptr = malloc(1);

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

struct car{
    int id;
    int age;
};
如果我是对的,对于大多数编译器,结构大小是8字节,因为int(4B)x2=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)
。为什么? 它在内存中是如何表示的?

sizeof(某物)
在内存中没有表示。它是在编译时确定的

由于
ptr
被声明为
car*
sizeof(*ptr)
对于编译器来说是
car结构的大小

这不取决于ptr的值或它指向的位置,即使它为null


另一方面,
sizeof(ptr)
(不带星号)是指针的大小,取决于系统(即64位上的8字节)。在这种情况下,指针对象的类型无关紧要。

表达式的类型
*ptr
是struct car,根据您自己的计算是8

至于为什么这三种情况都说
sizeof(*ptr)
:在这三种情况下,C都认为您的
ptr
变量是指向您声明的car结构的指针。因此,它不能以不同的方式对待这3个不同的ptr变量,也不会以不同的方式对待*ptr。无论它是单个car项(1种情况),还是数组中多个car项中的一个(第2种情况),或者实际上是一个一字节长的内存中的一个完全损坏的位,甚至不是完整的car结构(第3种情况)


C信任程序员确保所指向的东西确实存在。

在我看来,你似乎在所有
sizeof
中设置了指针的大小,这显然在同一个系统上总是具有相同的大小。谢谢你的回答,是的,你是对的,每次都是8B,但我不明白内存分配是如何工作的。我指的是它的表示方式。尝试
sizeof(struct car)
,然后在结构中添加另一个int并重新运行程序。也不要删除
sizeof(*ptr)
,这样做时,它应该会显示不同的结果。案例2是约束冲突(编译器必须报告问题)他的
sizeof
是指针的大小,指针指向什么并不重要,因此它与他的结构无关。唯一的问题是,他要求一个指针的大小。@MeikVtune请在OP中读到:“在这3种情况下,*ptr的大小是8,为什么?”。我想你会看到答案是相关的,特别是对于“为什么”这个大问题。
sizeof(*a)
将始终输出指针的大小,这取决于系统
sizeof(struct car)
在本例中还将输出8,因为int将输出4。这仍然不会改变指针是8。如果他输入第三个int,
sizeof(struct car)
应该输出16。@MeikVtune尝试使用一些大的结构,你会看到。@MeikVtune
sizeof(*任何东西)
肯定不会总是输出8,除非
anything
是指向8字节长数据类型的指针<代码>字符*任何东西;printf(“%zu\n”,sizeof(*任何内容))将输出
1
。在任何情况下,都不要求所有指针大小相同。请尝试
sizeof(int)
sizeof(*a)
,其中a是任意值。我做到了。在问题中,
ptr
不是一个类型,而是一个变量。因此,EPXpression
*ptr
的类型是
car
。如果你的意思是“A在什么地方”,“A是任何类型”,那么请考虑<代码> siZoof(*a)< /> >甚至不是正确的语法。code>sizeof(a*)
是,这确实意味着指针类型,但我不认为这与问题有什么关系。好的,谢谢大家的回答。因此,如果我理解没有办法检查分配内存的大小。