C语言之结构体以及结构体对齐访问

简介:

1:简单理解,结构体就是数组的进一步发展,数据的优点和缺陷在于数据里面是元素类型必须相同,但是结构体没有这个要求,结构体里面元素的类型可以相同也可以不同。


2:结构体的定义:

1
2
3
4
5
struct  student
{
     int  age;
     char  name[20];
}s1;

上面这种方法是结构体定义的同时定义变量,结构体的定义有两部分组成

struct studen:结构体的类型

s1:类型为struct student的结构体变量,当然还可以用struct studet s2;l来定义变量s2

注意结构体里面的元素不能再创建的时候直接赋值,而是要通过外部访问来对结构体进行填充


3:结构体里面变量的访问

    结构体里面的元素访问方式有两种,一种是  .    一种是->,但其实质上都是通过指针来访问的。

C语言规定用结构体的变量来访问结构体的时候是用  .  用结构体变量的指针来访问结构体的时候用->


4:结构体的对齐访问

    首先要知道一点,我们使用 . 的方式来访问结构体时是不同考虑结构体内存对齐问题的,这部分编译器会帮我们处理,但是如果我们想通过指针方式来访问结构体里面的各元素的时候就需要考虑内存对齐的问题。结构体内存对齐访问一个主要原因是硬件本身的物理限制,使用对齐访问可以提高访问的效率。但是内存对齐也会带来内存空间浪费的问题,所以内存对齐访问实际上是通过牺牲内存空间来换取的速度。


5:结构体对齐的规则和运算

    编译器本身可以设置内存对齐的规则,但是一下几点规则需要记住

(1)32位编译器,一般米、默认是4字节对齐

(2)结构体整体本身必须安置在4字节对齐处,也就是结构体的首地址必须是4整数的倍数(如果编译设置为n字节对齐访问,则首地址就是n的整数倍(n = 1 2 4 8 16 ...))

(3)结构体中每个元素本身必须对齐存放

(4)整个结构体的所占的内存空间必须是4的整数倍(同样如果是n字节对齐就是n的整数倍)

1
2
3
4
5
6
7
8
9
10
11
12
13
struct  mystruct1
{                         //1字节对齐        //4字节对齐
int  a;            // 4                 //   4
char  b;           //1                   //   2
  short  c;          //2                 //   2
}mystr1; 
 
struct  mystruct2
{                   //1字节对齐          //4字节对齐
char  a;            // 1           //   4  (1+3)3字节填充
int     b;           //4                  //   4
  short  c;           //2            //   4  (2 +2)2字节填充
}mystr2;

分析:

  首先是整个结构体,整个结构体变量4字节对齐是由编译器保证的,然后再是第一个元素a,a的开始抵制就是整个结构体的开始地址,所以自然就是4字节对齐的,但是的结束地址此时是不确定的,得由下一个元素决定;

第二个元素b,因为上一个元素a本身占4字节,其本身就是对齐的,所以留给b的开始地址也是4字节对齐,所以b就可直接存放(b存放的开始位置就决定a要占多少个字节,这里因为元素a字节刚好满足4字节对齐,不需要进行填充,所以这里a就占4字节),b的起始地址决定后,结束地址的确定需要依赖于下一个元素,原因是可能要进行填充,并且下一个元素的类型不通,则需要填充的字节数也是不同的;


本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1861684


相关文章
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
129 14
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
149 10
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
54 6
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
155 13
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
70 11
C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力
本文探讨了C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力。文章还分析了数据结构的选择与优化、算法设计的优化策略、内存管理和代码优化技巧,并通过实际案例展示了C语言在排序和图遍历算法中的高效实现。
47 2
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
60 4
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
91 10
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等