【C/C++】结构体内存分配问题

规则1:以多少个字节为单位开辟内存
就是说,该结构体最终所占字节大小,是这个单位的整数倍
给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员
哪个基本类型的成员占字节数多,就以它大大小为单位开辟内存
在gcc中出现了double类型的例外
(1):成员中只有char型数据 ,以1字节为单位开辟内存。
(2):成员中出现了short 类型数据,没有更大字节数的基本类型数据。 以2字节为单位开辟内存
(3):出现了int 、float 没有更大字节的基本类型数据的时候以4字节为单位开辟内存。
(4):出现了double类型的数据
        情况1:
                在vc里,以8字节为单位开辟内存。
        情况2:
                在gcc里,以4字节为单位开辟内存
无论是那种环境,double型变量,占8字节。
(5):如果在结构体中出现了数组,数组可以看成多个变量的集合。
如果出现指针的话,没有占字节数更大的类型的,以4字节为单位开辟内存。
(6):在内存中存储结构体成员的时候,按定义的结构体成员的顺序存储。
规则2:字节对齐
所谓的起始内存单元,是结构体内该元素,相对结构体首地址的位置。
代码验证:
typedef struct user{
  char c;
  short  s;
  int a;
}user;



  user *u1 =(user*)malloc(sizeof(user));

  printf("u1- %p\n char -%p\n short -%p\n int -%p\n",u1,&(u1->c),&(u1->s),&(u1->a));

结果:

(1):char
1字节对齐 ,即存放char型的变量,起始内存单元的编号是1的倍数即可。
(2):short
2字节对齐 ,即存放short int 型的变量,起始内存单元的编号是2的倍
数即可。
(3):int
4字节对齐 ,即存放int 型的变量,起始内存单元的编号是4的倍数即
(4):long 在32位平台下,4字节对齐 ,即存放long int 型的变量,
起始内存单元的编号是4的倍数即可
(5):float
4字节对齐 ,即存放float 型的变量,起始内存单元的编号是4的倍数即
(6):double
        a.vc环境下
                8字节对齐,即存放double型变量的起始地址,必须是8的倍数,double变量
占8字节
        b.gcc环境下
                4字节对齐,即存放double型变量的起始地址,必须是4的倍数,double变量
占8字节。
注意:
当结构体成员中出现数组的时候,可以看成多个变量。
开辟内存的时候,从上向下依次按成员在结构体中的位置顺序开辟空间
 struct stu{
 int num;
 int age;
 }lucy;
 8字节

 struct stu{
 char sex;
 int age;
 }lucy;
 8字节

 struct stu{
 char a;
 short int b;
 int c;
 }temp;
 8字节

 struct stu{
 char a;
 int c;
 short int b;
 }temp;
 12字节

 struct stu{
 char buf[10];
 int a;
 }temp;
 16字节


 struct stu{
 char a;
 double b;
 };
 12字节

为什么要有字节对齐?
用空间来换时间,提高cpu读取数据的效率
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C语言中,结构体内存的管理主要依赖于malloc和free函数。malloc函数用于分配内存空间,而free函数用于释放已分配的内存空间。当结构体中存在指针时,需要注意内存的分配和释放顺序,否则可能会导致内存泄漏。 在结构体中存在指针的情况下,首先要使用malloc为指针变量分配内存空间。然后,在释放结构体内存时,需要先释放指针变量所指向的内存空间,再释放结构体本身的内存空间。释放的顺序错误或者忘记释放都会导致内存泄漏。 举个例子,如果有一个结构体定义如下: typedef struct { char *p; int i; char ch<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++内存管理](https://blog.csdn.net/CS_COPy/article/details/123031978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C/C++结构体动态内存的管理(malloc和free)](https://blog.csdn.net/weixin_45676049/article/details/107417457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值