C---struct结构体/结构体内存对齐

1 结构体

结构体可以存储不同的数据类型,定义结构体使用 struct 关键字
结构体变量的定义可以和结构体的声明同时

struct 结构体名 {
    //结构体成员
    int a;
    char b;
    float c;
}结构体变量;

结构体名,结构体成员,结构体变量,这三者出现两个即可

1.1 结构体变量的定义放在结构体的声明之后

struct Test {
    int a;
    char b;
    float c;
};
//声明机构体变量test1,使用struct test即可声明其他的变量
struct Test test1;

1.2 匿名结构体定义结构体变量

//声明结构体变量test1,没有结构体名,这样就不能再次定义新的结构体变量了
struct {
    int a;
    char b;
    float c;
}test1;

给结构体成员赋值,用的是“ . ”

test1.a = 3;

2 结构体类型别名

typedef 是用来定义自己习惯的数据类型名称的,简单举例:
下面的定义方式,a和b均是 int 数据类型的

typedef int  qiaoint;
int a;
qiaoint b;

在结构体中的使用方式如下

typedef struct {
    int a;
    char b;
    float c;
}Test;
//
Test test1;

3 结构体内存

结构体与数组不同,数组存储的是相同数据类型的数据,而结构体存储的是不同的数据类型,但是,计算机在读取内存时,是按照固定大小进行读取的

3.1 结构体内存对齐

3.1.1 举例1

#include <stdio.h>

typedef struct {
    char a;
    int b;
    char c;
}Test;

void main()
{
    Test test1;
    printf("a的地址:%p,b的地址:%p,c的地址:%p\n",&test1.a,&test1.b,&test1.c);
    printf("结构体占用内存大小为:%d\n",sizeof(test1));
}

上述代码中,char占一个字节,int占4个字节,总共应该是占用6个字节,实际运行如下,发现char占用4个字节
在这里插入图片描述

a的地址:000000000061FE14,b的地址:000000000061FE18,c的地址:000000000061FE1C
结构体占用内存大小为:12

这就是结构体的内存字节对齐以结构体中内存占用最大的数据类型所占用的字节数为标准,所有的成员在分配内存时都要与这个长度对齐

3.1.2 举例2

#include <stdio.h>

typedef struct {
    char a;
    char b;
    int c;
}Test;

void main()
{
    Test test1;
    printf("a的地址:%p,b的地址:%p,c的地址:%p\n",&test1.a,&test1.b,&test1.c);
    printf("结构体占用内存大小为:%d\n",sizeof(test1));
}

与举例1不同的是,这次是两个占用1字节的char类型数据在前面,此时内存分布为,占用字节共8个
在这里插入图片描述

a的地址:000000000061FE18,b的地址:000000000061FE19,c的地址:000000000061FE1C
结构体占用内存大小为:8

3.1.3 举例3

#include <stdio.h>

typedef struct {
    char a;
    char b;
    char c;
    char d;
    char e;
    int f;
}Test;

void main()
{
    Test test1;
    printf("a的地址:%p,b的地址:%p,c的地址:%p,d的地址:%p,e的地址:%p,f的地址:%p\n",&test1.a,&test1.b,&test1.c,&test1.d,&test1.e,&test1.f);
    printf("结构体占用内存大小为:%d\n",sizeof(test1));

内存占用情况
在这里插入图片描述

a的地址:000000000061FE14,b的地址:000000000061FE15,c的地址:000000000061FE16,d的地址:000000000061FE17,e的地址:000000000061FE18,f的地址:000000000061FE1C
结构体占用内存大小为:12

3.1.4 总结

  1. 结构体内存对齐是按最大的字节对齐的
  2. 一个单元的内存没有用完时,剩下的够下一个数据使用时,是可以继续使用的
  3. 不足以存放时,会再申请一个单元的内存
  4. 写结构体的时候,需要按照合理的顺序书写,尽量占用最少的内存
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值