我想问一下关于结构体嵌套是怎么算内存大小的,代码如下

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

struct list {
   struct list_node *head;
   int count;       
};

struct list *list_create() {
   struct list *list = NULL;
   
   list = (struct list *)malloc(sizeof(struct list));
   if (list == NULL) return NULL;
   
   list->head = NULL;
   list->count = 0;
   
   return list;       
}


这个不算嵌套,因为next是指针,不管你的指针指向的类型有多大,指针本身只有4个字节或者8个字节

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在C语言中,结构体嵌套的内存分配是按照结构体成员的顺序进行的。在您的代码中,struct list结构体包含了一个指向struct list_node结构体的指针head和一个整型变量count。因此,struct list结构体的内存大小为指针类型的大小(通常是4或8字节)加上整型变量的大小(通常是4字节),共计8或12字节,具体取决于编译器和操作系统的位数。

同样地,struct list_node结构体包含了一个整型变量data和一个指向struct list_node结构体的指针next。因此,struct list_node结构体的内存大小为指针类型的大小加上整型变量的大小,共计8或12字节。

在您的代码中,struct list_node *类型的指针变量head指向struct list_node结构体的第一个成员data,因此head指针指向的内存块的大小为整型变量data的大小。head指针指向的内存块的地址是struct list_node结构体的地址,因此head指针本身的大小为指针类型的大小。

总结一下,struct list结构体的内存大小为8或12字节,struct list_node结构体的内存大小为8或12字节。在您的代码中,通过malloc()函数动态分配了一个struct list结构体的内存空间,因此该结构体所占用的内存大小为8或12字节。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

结构体字节对齐,C语言结构体字节对齐详解,供参考:http://c.biancheng.net/view/243.html

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7565784
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:带你用一个更好的方法注释掉一段代码
  • 除此之外, 这篇博客: 如何理解指针与数组之间的关系中的 下面我们再来分析两个有意思的代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (*(void(*)()0)()

    我们从内往外一步一步来分析:

    1、(void(*)()0 将0强制转换为数组指针
    假设 a=(void(*)()0
    2 、 *a 将a解引用
    3、整体是个函数

    void (*signal(int,void(*)(int)))(int);

    1、signal是一次函数声明
    2、signal函数的参数:第一个是int(整形),第二个是函数指针,该函数指针指向的函数参数为int,返回类型是void

    5、函数指针数组
    函数指针数组:数组是存放相同类型数据的存储空间,当我们把函数的地址存到一个数组中,这个数组就叫做函数指针数组。
    通过指针数组 :int *arr[10]
    得到函数指针数组:int (*arr[10])()

  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 左旋和右旋的代码实现小节, 巩固相关知识点