title:结构体
date:2021-9-29
结构体的定义初始化
1、不使用typedef的结构体
以下例子中,不加typedef时,struct STUDENT 是结构体类型名
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct STUDENT {
int num;
char name[20];
int age;
int weight;
};
int main() {
struct STUDENT stu;
stu.num = 101;
//数组直接输入字符串需用 strcpy函数,不能直接赋值
strcpy(stu.name, "hello");
stu.age = 18;
stu.weight = 100;
/*
student stu = { 101,"hello",18,100 };
*/
printf("学号: %d 姓名: %s 年龄: %d 体重:%d", stu.num, stu.name, stu.age, stu.weight);
return 0;
}
2、使用typedef的结构体
定义一个新的类型
以下例子中,加了typedef,struct STUDENT是结构体类型名,student也是结构体类型名
student s中的s是结构体变量
#include<stdio.h>
#include<stdlib.h>
typedef struct STUDENT{
int number;
int age;
int weight;
int score;
char s;
}student;
typedef int INT32;
int main(){
INT32 a;
student s;
return 0;
}
3、结构体数组
#include<stdio.h>
#include<stdlib.h>
typedef struct STUDENT{
int number;
int score;
}student;
int main(){
int array[10];
char buffer[10];
student s[10] = {{1,10},{2,30}};
s[0].number;
s[0].score;
s[1];
student* p = s;
printf("%d",s[0].score);
printf("%d",(*p).score);
printf("%d",p->score);
return 0;
}
结构体中字节对齐原则
- 按照最长的成员对齐
- 保证整数倍地址对齐
按照最长的成员对齐:结构体中默认以所占字节最长的成员划分。例如,一个结构体中 int 占4个字节最长,则按 4字节作为排列长度
保证整数倍地址对齐:一个类型对齐的地址应是该类型所占字节的倍数。例如 char 类型占一个字节,它能占的地址是1 的倍数,short 占2个字节,它能站得地址是2的倍数
结构体默认按最长字节对齐,也可认为规定对齐的最长长度
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// #pragma pack(2) 规定在这个范围里的结构体按长度 2 对齐
#pragma pack(2)
typedef struct STUDENT {
int a;
char c;
char res[3];
} student;
#pragma pack(2)
int main() {
printf("%d", sizeof(student));
return 0;
}
结构体定义的原则:保证结构体字节对齐
#include<stdio.h>
#include<stdlib.h>
#pragma pack(2) /*指定按2字节对齐*/
typedef struct A {
int a;
char c;
char res[1];
}a;
#pragma pack() /*取消指定对齐,恢复缺省对齐*/
typedef struct B {
int a;
char c;
char res[1];
}b;
int main() {
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(b));
return 0;
}
/*
6
8
*/