C语言—结构体总结-创新互联

结构体 1 结构体类型的设计

在C语言中,结构体是一种数据类型(由程序开发者自己设计的类型)。可以使用结构体来存放一组不同类型的数据。结构体的定义形式为:

怀仁ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
  struct 结构体名{ 成员列表;(基本数据类型;指针;数组或其他结构类型)
      };
2 结构体变量的初始化

结构体是一种数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间。

结构体变量初始化
#includetypedef struct Student {//typedef 类型的重名名,将结构体Student重命名为stu
	int id;
	const char* name; //节省内存
	char sex[4];
	int age;
}stu;

int main() {stu st1 = {10010,"张三","男",19 };
	printf("%s\n", st1.name);  //张三
}
结构体嵌套结构体
#includestruct Date {int year;
	int month;
	int day;
};

struct Student {int id;
	const char* name; //节省内存
	char sex[4];
	int age;
	Date birth;
};

int main() {Student stu1 = {10010,"丽丽","女",19,2000,10,1 };
	Student stu2 = {10011,"思思","女",18,{1999,12,1} };
	Date date;
	return 0;

}
3 结构体成员访问
#define  _CRT_SECURE_NO_WARNINGS
#include#includetypedef struct Student {int id;
	char name[10]; //节省内存
	char sex[4];
	int age;
}stu;

int main() {stu st1 = {10010,"张三","男",19 };

	stu* st2 = &st1; //定义一个结构体指针变量st2.

	//strcpy((*st2).name, "lisi");//方式1:(*结构体类型指针).成员名
	//strcpy(st2->name, "lisi");//方式2:结构体类型指针->成员名
	strcpy(st1.name, "lisi");//方式3:结构体变量.成员名
	
	//printf("%s\n", (*st2).name);//方式1  lisi
	//printf("%s\n", st2->name);//方式2  lisi
	printf("%s\n", st1.name); //方式3  lisi
}
4 结构体大小 如何计算结构体的大小?
  1. 结构体变量的首地址,必须是MIN { 结构体大基本数据类型成员所占字节数,指定对其方式 } 的整数倍。
  2. 结构体每个成员对于结构体首地址的偏移量,必须是MIN { 基本数据类型成员,指定对齐方式 } 的整数倍。
  3. 结构体的总大小,必须是 { 大基本数据类型成员所占字节数(将嵌套结构体里的基本类型也算上,得出大基本数据类型成员所占字节数),指定对齐方式 } 的整数倍。
4-1 未指定对齐值

示例一

#includeint main() {struct A {int a;//4
		char b;//2 (前面4是2的倍数,不需要再加)  +2
		double c;//8 (前面的4+2=6不是8的倍数,需要再加上2)
		short d;//2 (前面4+2+2+8=16是2的倍数)   +2
		int e;//4 (前面16+2=18不是4的倍数,需要再加上2)
	};

	printf("%d\n", sizeof(A));//4+2+2+8+2+2+4=24
		
}

注意:VS默认对齐数为8。24恰好=MIN { 8(大基本数据类型成员所占字节数),8(对齐方式)} 的整数倍。

示例二

#includeint main() {struct A {int a;//4
		char b;//1 (4是1的倍数,不需要再加)
	};
	//4+1=5
	//最接近5
	//并且是MIN { 4(大基本数据类型成员所占字节数),8(对齐方式)} 的整数倍的数为8。

	struct B {char c;//1   +1
		short d;//2  (前面1不是2的倍数,所以再加1)
		A a;//8  (A不是基本数据类型,不需要和前面比较)
		int f;//4  (前面的1+1+2+8=12是4的倍数)
	};
	//1+1+2+8+4=16
	//16是MIN { 4,8 } 的整数倍
	//注意:大基本数据类型成员所占字节数(将嵌套结构体里的基本类型也算上)为4
	

	printf("%d\n", sizeof(A));//8
	printf("%d\n", sizeof(B));//16
	
}

注意:在嵌套结构体中,大基本数据类型成员所占字节数,要将嵌套结构体里的基本类型也算上.

示例三

#includeint main() {struct A {char name[10];//10  +2
		int a;//4 
		char* sex;//X64:8字节   X86:4字节   
	};
	//10+2+4+8=24  10+2+4+4=20 
	//24恰是MIN { 8,8 }的整数倍
	//20恰是MIN { 4, 8 }的整数倍

		printf("%d\n", sizeof(A));//24或者20
		
}

这里的结果可能是20或24。是因为char* sex;指针的大小和平台有关系,在X64系统中为8字节,在X86系统中为4字节。

4-2 指定对齐值

预处理指令#pragma pack(n)可以改变默认对齐数。n取值可以是1,2,4,8,16,……
示例一

#include#pragma pack(4)
struct A {double a;//8
	int b;//4 
};
#pragma pack()
//8+4=12 是MIN { 8,4 }的整数倍

int main() {printf("%d\n", sizeof(A));//12
}

示例二

#include#pragma pack(2)
struct A {char a;//1 +1
	int b;//4  
};
#pragma pack()
//1+1+4=6 是MIN { 4(大基本数据类型成员所占字节数),2(对齐方式) }的整数倍

#pragma pack(4)
struct B {int i;//4
	char c;//1  
	A a;//6  +1
	int d;//4 (4+1+6=11不是MIN{4,4}的倍数,需要再加1)
};
#pragma pack()
//4+1+6+1+4=16 是MIN { 4,4 }的整数倍


int main() {printf("%d\n", sizeof(A));//6
	printf("%d\n", sizeof(B));//16
}

示例三

#include#pragma pack(4)
struct A {char a; //1  +3
	double b;//8
	int c;//4 
	short d;//2	
};
#pragma pack()
//1+3+8+4+2=18   最接近MIN{8,4}的整数倍   20    


#pragma pack(4)
struct B {int e;//4
	char f;//1
	A a;//20  +3 
	double g;//8
};
#pragma pack()
//4+1+20+3+8=36 最接近MIN{8,4}的整数倍  36



int main() {printf("%d\n", sizeof(A));//20
	printf("%d\n", sizeof(B));//36
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:C语言—结构体总结-创新互联
本文路径:http://hbruida.cn/article/cchpcc.html