STRUCT的内存

本文探讨了C语言中结构体内存的分配规则,即先定义的成员位于低地址,后定义的位于高地址,并遵循内存对齐策略。在C++中,结构体的首元素地址通常会与结构体地址不一致,因为会预留4字节以区别对象地址。作者在实验过程中遇到疑惑,发现使用结构体名后,后续输出出现异常,希望能得到解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C语言中,结构体的内存是由先到后顺序占用空间的。

先定义的在低地址,后定义的在高地址。地址采用空间对其策略。

其实这是一篇问题贴,一直没有弄懂是什么问题!!!

在结构体内存中

结构体首元素地址和结构体首地址一致。(C++不一致),c++中,一般会空出开始的4字节,为了区别对象地址,和第一个成员的地址。通常是1字节,但是字节对齐的时候,就占用了4字节。
实际上,你看到sizeof(空结构体) =4.

但是,首地址会影响后面的地址。

typedef struct
{
  
  int a;
  char b;
  char c[12];
}stu;


stu s={7,'c',"qqq"};

printf("%d\n",sizeof(stu));

printf("%p\n",&(s.a));
printf("%p %p %p %p\n",s,  &s,     &(s.a), &(s.c));
printf("%p %p %p %p\n",&s, &(s.a), &
### C/C++ 中 `typedef struct` 与内存使用的示例解释 #### 结构体定义及其内存分配 在C/C++编程中,结构体是一种用户自定义的数据类型,允许存储不同类型的数据项。当使用`typedef struct`来定义新的数据类型名称时,这不仅简化了后续代码编写过程中的语法复杂度,还提高了可读性维护性。 考虑如下结构体定义: ```c typedef struct { int age; char name[20]; } Person; ``` 这里定义了一个名为`Person`的新类型[^1]。每当创建该类型的对象(即实例化),编译器会为其分配足够的连续字节空间以容纳所有成员变量——在这个例子中是整数型的年龄字段字符数组形式的名字字段。 对于上述`Person`结构体而言,在32位系统上其大小可以通过以下方式计算得出: - 整形(`int`)通常占用4个字节; - 字符串(`char[]`)长度为20,则需要20个字节的空间; 因此整个结构体会占据至少24个字节的记忆区域。然而实际情况下由于存在填充(padding),最终可能超过这个数值以便于提高访问效率[^3]。 #### 动态内存管理 除了静态地声明结构体变量外,还可以利用动态内存分配函数如`malloc()`或`calloc()`来获取堆上的存储位置给定数量的对象。下面展示如何申请并初始化一个指向`Person`类型的指针所指向的一块新近获得的内存区段: ```c #include <stdlib.h> // ... Person* p = (Person*) malloc(sizeof(Person)); if(p != NULL){ (*p).age = 25; // 或者写成 p->age=25; strcpy((*p).name,"John Doe"); // 假设已包含<string.h>头文件用于字符串复制操作 } free(p); // 记得释放不再使用的资源 ``` 这段程序片段展示了怎样安全有效地处理潜在的空指针异常情况,并且遵循良好实践确保不会造成内存泄漏问题[^4]。 #### 数组与链表构建 借助`typedef struct`机制能够轻松实现更复杂的抽象数据类型比如单向链接列表节点(Node)。每个Node都含有两个部分:一是保存有效载荷(payload)的信息域(data field),二是下一个节点地址(next pointer)。具体来说, ```c typedef struct Node{ int data; struct Node *next; } ListNode; ListNode* head = NULL; // 列表头部为空表示初始状态无任何元素存在 ``` 此模式下每一个新增加到序列末端的新单元都会被赋予适当的位置关系从而形成一条线性的链条状连接起来的整体结构[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值