在以下情况下,谁能解释我的大小分配方式?

时间:2019-05-29 10:08:49

标签: c pointers structure self-reference

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

sizeof(struct node)

struct node { int data; }; 的输出为16。


sizeof(struct node)

struct node { struct node *next; }; 的输出为4。


sizeof(struct node)

struct node { int data; struct node *next; }*link; 的输出为8。


sizeof(link)

class Avaria(models.Model): freguesia = models.ForeignKey(Freguesia, on_delete=models.CASCADE,verbose_name="Freguesia") rua = models.ForeignKey(Rua, on_delete=models.CASCADE,verbose_name="Rua") 始终为8,即使我在结构中添加了几个元素。


3 个答案:

答案 0 :(得分:1)

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

因此,如果struct node仅包含int,则其大小为4。如果仅包含指针,则其大小为8。如果同时包含int和a指针,则需要12个字节,但是为了保持指针的对齐,它将结构填充为8的倍数,结果大小为16。

在最后一个示例中,您将link定义为指向struct node的指针。在这种情况下,struct node包含什么都没有关系。由于link只是一个指针,因此其大小将始终为8。

同样,请注意,这只是对您的平台的最佳猜测。不能保证所有这些,它可能因一个平台而异。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  1. sizeof返回的字节数
  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