struct Stu{char name[ 20 ]; // 名字int age; // 年龄char sex[ 5 ]; // 性别char id[ 20 ]; // 学号};
- #include
-
- // 定义一个结构体类型 Point
- struct Point {
- int x;
- int y;
- };
-
- int main() {
- // 创建并初始化结构体变量的几种方式
-
- // 1. 分别初始化每个成员
- struct Point p1;
- p1.x = 10;
- p1.y = 20;
-
- // 2. 声明的同时初始化
- struct Point p2 = {30, 40};
-
- // 3. 使用C99提供的指定成员初始化
- struct Point p3 = {.y = 50, .x = 60};
-
- // 打印结构体变量的值
- printf("Point p1: x = %d, y = %d\n", p1.x, p1.y);
- printf("Point p2: x = %d, y = %d\n", p2.x, p2.y);
- printf("Point p3: x = %d, y = %d\n", p3.x, p3.y);
-
- return 0;
- }
- #include
-
- struct Stu {
- char name[20]; // 名字
- int age; // 年龄
- char sex[5]; // 性别
- char id[20]; // 学号
- };
-
- int main() {
- // 按照结构体成员的顺序初始化
- struct Stu s = { "张三", 20, "男", "20230818001" };
-
- // 打印结构体s的成员
- printf("name: %s\n", s.name);
- printf("age : %d\n", s.age);
- printf("sex : %s\n", s.sex);
- printf("id : %s\n", s.id);
-
- // 按照指定的成员初始化
- struct Stu s2 = {
- .age = 18,
- .name = "lisi",
- .id = "20230818002",
- .sex = "女"
- };
-
- // 打印结构体s2的成员
- printf("name: %s\n", s2.name);
- printf("age : %d\n", s2.age);
- printf("sex : %s\n", s2.sex);
- printf("id : %s\n", s2.id);
-
- return 0;
- }
//匿名结构体struct{char name[ 20 ]; // 名字int age; // 年龄char sex[ 5 ]; // 性别char id[ 20 ]; // 学号}p;//像这样的匿名结构体是不能多次使用,只能使用一次struct{char name[ 20 ]; // 名字int age; // 年龄char sex[ 5 ]; // 性别char id[ 20 ]; // 学号}*pa; pa是匿名结构体指针变量pa=&p;//这样是不合法 因为一个是结构体变量 p,另一个是结构体指针变量 pa。匿名结构体的这两个定义是独立的, 编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。
struct Node{int data;struct Node * next ;};如下图
学习结构体的内存对齐,其实也是计算结构体的⼤⼩
结构体的对齐规则:
1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。- VS 中默认的值为 8- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤ 的)的整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
//假设对齐数 默认的值为 8// #pragma 这个预处理指令,可以改变编译器的默认对⻬数。// # pragma pack(1) // 设置默认对⻬数为 1//# pragma pack() // 取消设置的对⻬数,还原为默认struct data
{
int a;
char b;
short c;
short d;
}AA_t;
struct data1
{
int a;
char b;
short c;
short d;struct data e;
}AA;
结构体 struct data1在struct data的基础之上把struct data嵌套在 struct data1里,所以按照对齐规则4,就是嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,struct data的最大对齐数是4,那偏移量就从12处开始,struct data大小为12个字节就到偏移量23处,此时此刻a、b、c、d、e所占字节为24,struct data1结构体大小为所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍,struct data1结构体的最⼤对⻬数为4,24是4的倍数,所以struct data1结构体大小为24
//举例:struct S1{char c1;int i;char c2;};struct S2{char c1;char c2;int i;};// S2 比 S1 结构体 所占空间就要小。