谁能解释一下在以下情况下如何分配大小?

Can any one explain me how the size get allocated in the following case?

我对 gcc 编译器的大小分配感到困惑,任何人都可以帮助我如何为以下代码分配大小。

struct node
{
 int data;
 struct node *next;
};

sizeof(struct node) 输出为 16。


struct node
{
 int data;
};

sizeof(struct node) 输出为 4.


struct node
{
struct node *next;
};

sizeof(struct node) 输出为 8.


struct node
{
int data;
struct node *next;
}*link;

sizeof(link) 始终为 8,即使我向结构中添加了更多元素。


sizeof(link) 将始终 return 8 个字节,因为这是 64 位计算机中指针的大小。

如果你想要结构的大小,你需要做 sizeof(struct node) 因为它会给你实际结构的大小。

对于链表类型的结构,我会向您推荐这样的东西

 typedef struct node Node, *pnode;
    struct node{
       //some vars
       pnode next;
    }

然后你只需要将它声明为你的主要或任何你作为

pnode list = NULL;

sizeof(Node) //for memory allocation
  1. sizeof return 字节大小
  2. int 有 32 位 = 4 字节
  3. 任何指针 char*struct any* 都有 const sizeof 取决于内存结构,在你的例子中是 8。
  4. 因为内存分配,你的第一个例子有 sizeof = 16,更多在这里:https://en.wikipedia.org/wiki/Data_structure_alignment,你可以添加 #pragma pack(1) 并查看差异,应该是 4 + 8 = 12

在您的 特定平台 上,看起来 int 的大小为 4,指针的大小为 8。它看起来还想将指针对齐到8 字节边界。

所以如果struct node只包含一个int,那么它的大小是4。如果它只包含一个指针,它的大小是8。如果它同时包含一个int和一个指针,那么它需要12个字节,但是为了保持指针的对齐,它将结构填充为8的倍数,结果大小为16.

在最后一个示例中,您将 link 定义为指向 struct node 的指针。在这种情况下,struct node 包含什么并不重要。因为 link 只是一个指针,所以它的大小总是 8。

再次请注意,这只是对您的 平台的最佳猜测。 None 这是有保证的,它可能因平台而异。