C 有谁能解释一下,在以下情况下,大小是如何分配的?

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

我对gcc编译器的大小分配感到困惑,有谁能帮我为下面的代码分配大小吗

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
  • 由于内存分配,您的第一个示例的sizeof=16,更多信息如下:,您可以添加
    #pragma pack(1)
    ,并查看差异,应为4+8=12
  • 在您的特定平台上,它看起来像
    int
    大小为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