C 有谁能解释一下,在以下情况下,大小是如何分配的?
我对gcc编译器的大小分配感到困惑,有谁能帮我为下面的代码分配大小吗C 有谁能解释一下,在以下情况下,大小是如何分配的?,c,pointers,structure,self-reference,C,Pointers,Structure,Self Reference,我对gcc编译器的大小分配感到困惑,有谁能帮我为下面的代码分配大小吗 struct node { int data; struct node *next; }; sizeof(struct节点)它的输出为16 sizeof(struct节点)它的输出为4 sizeof(结构节点)它的输出为8 sizeof(link)始终为8,即使我在结构中添加了几个元素 sizeof(link)将始终返回8字节,因为这是64位计算机中指针的大小 如果需要结构的大小,则需要执行sizeof(struc
struct node
{
int data;
struct node *next;
};
sizeof(struct节点)
它的输出为16
sizeof(struct节点)
它的输出为4
sizeof(结构节点)
它的输出为8
sizeof(link)
始终为8,即使我在结构中添加了几个元素
sizeof(link)
将始终返回8字节,因为这是64位计算机中指针的大小
如果需要结构的大小,则需要执行sizeof(struct node)
,因为它将为您提供实际结构的大小
对于链表类型的结构,我建议您这样做
typedef struct node Node, *pnode;
struct node{
//some vars
pnode next;
}
然后你只需要将它声明为你的主文件或任何你想要的文件
pnode list = NULL;
sizeof(Node) //for memory allocation
sizeof
返回字节大小int
具有32位=4字节char*
,struct Any*
都有const sizeof dependens内存结构,在您的例子中是8#pragma pack(1)
,并查看差异,应为4+8=12int
大小为4,指针大小为8。它还希望在8字节边界上对齐指针
因此,如果struct节点
仅包含一个int
,则其大小为4。如果它只包含一个指针,则其大小为8。如果它同时包含一个int
和一个指针,那么它需要12个字节,但为了保持指针的对齐,它将结构填充为8的倍数,从而产生16的大小
在最后一个示例中,将链接定义为指向结构节点的指针。在这种情况下,结构节点包含什么并不重要。由于link
只是一个指针,因此其大小始终为8
再次注意,这只是对您的平台的最佳猜测。所有这些都不能保证,而且在不同的平台上可能会有所不同。阅读有关结构填充和对齐的内容,sizeof(link)是8,因为您检查的是sizeof指针,而不是结构本身。sizeof(*link)将为您提供正确的结果。在typedefs中隐藏指针是一个可怕的习惯。但如果您正在编写win32应用程序,并且碰巧使用了LPSTR,那么它仍然是一个常用的示例。您使用的是typedef char*PSTR,*LPSTR,因为它使您的代码更易于阅读和更简单。这不会使代码很难阅读。这是一个非常糟糕的做法,在win32中使用并不能证明它是好的。那么你如何以一种良好的实践方式来做呢?只是为了不隐藏指针谢谢你,我对你的答案有一个清晰的了解,但我在你说它将结构填充到8的倍数的地方打了一针。你能简单地解释一下吗?@Selvabharat这种结构尺寸被填充到其中任何元素的限制性排列的倍数。例如,如果一个结构包含一个要在8字节边界上对齐的元素,则该大小将被填充为8的倍数。@Selvabharat这样做的一个原因是它可以将该结构的多个副本放置在一个数组中,并使所有副本都正确对齐。数组中的元素彼此直接相邻,因此如果第一个数组元素在8字节边界上对齐,那么它的大小必须是8的倍数,以保持下一个数组元素的8字节对齐。哇,我知道了,谢谢@tom-karzes@selvabharathis还请注意,如果结构包含一个int
后跟一个指针,则需要在两个结构成员之间放置4字节的填充,以便对齐指针。这样,如果将结构放置在8字节边界上,指针将正确对齐。因此,您还需要考虑序列。
struct node
{
int data;
struct node *next;
}*link;
typedef struct node Node, *pnode;
struct node{
//some vars
pnode next;
}
pnode list = NULL;
sizeof(Node) //for memory allocation