服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言深入回顾讲解结构体对齐

C语言深入回顾讲解结构体对齐

2022-12-14 12:34Bright-SKY C/C++

C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许你存储不同类型的数据项,本篇让我们来了解C 的结构体内存对齐

结构体对齐问题

1、知识点的引入:

struct data1
{
  char a;//1B
  int b;//4B
};
void test01()
{
  printf("%d\n",sizeof(struct data1));//8B 为啥?
}

C语言深入回顾讲解结构体对齐

2、对齐规则(默认对齐)

C语言深入回顾讲解结构体对齐

第一步:确定分配单位(每行开辟多少字节)

结构体中最大的基本类型的长度 为分配单位。

第二步:确定成员的偏移位置。

偏移位置:成员自身类型的整数倍(0~n倍)

第三步:收尾工作:

结构体的总大小必须是分配单位的整数倍

struct data
{
	char c;//1B
	int i;//4B
};
void test05()
{
	struct data d;
	//结构体的大小 >= 成员大小之和
	printf("%d\n",sizeof(struct data));//8
	printf("&d.c = %u\n",&d.c );
	printf("&d.i = %u\n",&d.i );
}

运行结果:

C语言深入回顾讲解结构体对齐

案例:

typedef struct
{
	int a;
	char b;
	short c;
	char d;
}DATA;
void test06()
{
	DATA d;
	printf("%d\n", sizeof(DATA));
	printf("%u\n", &d.a);
	printf("%u\n", &d.b);
	printf("%u\n", &d.c);
	printf("%u\n", &d.d);
}

C语言深入回顾讲解结构体对齐

案例1:

struct data1
{
  char a;//1B
  int b;//4B
};

C语言深入回顾讲解结构体对齐

案例2:

struct data2
{
  char a;
  short b;
  char c;
  int d;
};

C语言深入回顾讲解结构体对齐

案例3:

struct data2
{
  char a;
  short b;
  short c;
  char d;
};

C语言深入回顾讲解结构体对齐

案例4:

struct data2
{
  char a[7];
  short b;
  int c;
};

C语言深入回顾讲解结构体对齐

 

结构体嵌套结构体

第一步:确定分配单位(每行开辟多少字节)

所有结构体中最大的基本类型的长度 为分配单位。

第二步:确定成员的偏移位置。

普通成员偏移位置:成员自身类型的整数倍(0~n倍)

结构体成员的偏移量:该结构体的最大基本类型的整数倍

第三步:收尾工作:

结构体成员:是该结构体的最大基本类型整数倍。

结构体的总大小必须是分配单位的整数倍

C语言深入回顾讲解结构体对齐

C语言深入回顾讲解结构体对齐

案例:

typedef struct
{
	short d;
	char e;
}DATA2;
typedef struct
{
	short a;
	int b;
	DATA2 c;
	char f;
}DATA;
void test08()
{
	DATA data;
	printf("%d\n",sizeof(DATA));
	printf("a:%u\n", &data.a);
	printf("b:%u\n", &data.b);
	printf("c中d:%u\n",&data.c.d);
	printf("c中e:%u\n",&data.c.e);
	printf("f:%u\n",&data.f);
}

C语言深入回顾讲解结构体对齐

案例:

typedef struct
{
	char a;
	int b;
	short c;
}DATA;
void test10()
{
	DATA data={'a',100, 20};
	char *p = &data;
	printf("c = %hd\n", data.c);
	//需求 借助p访问20
	printf("c = %hd\n", *(short *)(p+8));
}

C语言深入回顾讲解结构体对齐

运行结果:

C语言深入回顾讲解结构体对齐

案例:

struct A
{
  char b;
  short c;
};
struct B
{
  int a;
  struct A ob;//结构体成员的偏移量
  int d;
};

C语言深入回顾讲解结构体对齐

案例1:

struct A
{
  short b;
  char c;
};
struct B
{
  int f;
  char a;
  struct A ob;//结构体成员的偏移量
  char d;
};

C语言深入回顾讲解结构体对齐

 

强制内存对齐

#pragma pack (value)时的指定对齐值value

第一步:确定分配单位(每行开辟多少字节)

min(value,最大的基本类型的长度) 为分配单位。

第二步:确定成员的偏移位置。

偏移位置:成员自身类型的整数倍(0~n倍)

第三步:收尾工作:

结构体的总大小必须是分配单位的整数倍

#include <stdio.h>
#include<stdio.h>
#pragma pack (4)
struct stu
{
  char a;
  short b;
  short c;
};
void test01()
{
  printf("%d\n",sizeof(struct stu));//6
}

注意事项:

C语言深入回顾讲解结构体对齐

 

拓展求结构体成员的偏移量

struct stu1
{
  char a;
  int b;
  char c;
  int d;
};

C语言深入回顾讲解结构体对齐

#include <stdio.h>
#include<stdio.h>
struct stu1
{
  char a;
  int b;
  char c;
  int d;
};
#define  OFF_SET(TYPE, member) (int)&(((TYPE *)0)->member)
void test01()
{
  struct stu1 data;
  printf("偏移量:%d\n",   OFF_SET(struct stu1, b) );//8
}

到此这篇关于C语言深入回顾讲解结构体对齐的文章就介绍到这了,更多相关C语言结构体对齐内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34981463/article/details/124936496

延伸 · 阅读

精彩推荐
  • C/C++C语言实现贪吃蛇游戏(命令行)

    C语言实现贪吃蛇游戏(命令行)

    这篇文章主要为大家详细介绍了C语言命令行实现贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiao_dou_ya_cool9342021-09-14
  • C/C++浅谈C++左值引用和右值引用

    浅谈C++左值引用和右值引用

    下面小编就为大家带来一篇浅谈C++左值引用和右值引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网12362021-04-27
  • C/C++C++ OpenCV模拟实现微信跳一跳

    C++ OpenCV模拟实现微信跳一跳

    这篇文章主要介绍了使用C++和OpenCV模拟实现微信跳一跳功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以...

    大千小熊4402022-07-16
  • C/C++基于C++11的threadpool线程池(简洁且可以带任意多的参数)

    基于C++11的threadpool线程池(简洁且可以带任意多的参数)

    C++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池...

    Lzpong6782021-07-26
  • C/C++C++循环队列实现模型

    C++循环队列实现模型

    这篇文章主要介绍了C++循环队列实现模型,较为详细的分析了循环队列算法的原理与实现方法,具有一定的参考借鉴价值,需要的朋友可以参考下...

    C++教程网12052021-02-21
  • C/C++C语言实现加密解密功能

    C语言实现加密解密功能

    这篇文章主要为大家详细介绍了C语言实现加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Ibelievesunshine12522021-08-19
  • C/C++C++实现简单学生信息管理系统

    C++实现简单学生信息管理系统

    这篇文章主要为大家详细介绍了C++实现简单学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    陆鳴笙8002022-10-24
  • C/C++嵌入式C程序优质编写全面教程规范

    嵌入式C程序优质编写全面教程规范

    这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序。感觉是有一定的参考价值,所以拿...

    zhzht198610115082022-11-04