全网最详细字节对齐代码详解,结构体占字节大小

#include
int main(void) {
	//字节对齐,各种数据类型是按照一定的规则在内存当中排列的
	short a;
	int b;
	double c;
	printf("%d,%d,%d\n",(int)&a%2,(int)&b%4,(int)&c%8);
	struct Stu1{ 	//总长度其中a长度为1,b长度为2,包含1个的填充字节 所以sizeof(Stu1)=4
		char a;
		short b;
	};
	struct Stu2{	//总长度其中a长度为1,b长度为4,包含3个的填充字节 所以sizeof(Stu2)=8
		char c;
		int d;
	};
	struct Stu1 A;
	struct Stu2 B;
	printf("%d,%d\n",(int)&A%2,(int)&B%4);	//结构体的首地址,一定能被结构体中的最宽基本类型的大小所整除,A中最宽是short 2字节;B中最宽是int 4字节
	printf("%d,%d\n",sizeof(A),sizeof(B)); 	//结构体成员相对于结构体变量的首地址的偏移量都是其成员大小的整数倍 
	/*--解释一下为什么总长度分别为4,而不是3,同时也保证4是最宽基本类型宽度(short)的整数倍 
	*下面是内存表示,假设Stu1首地址是1000(结构体中最大类型为short,所以满足可以被2整除)
	* Stu1    	  [a]	 	    [b]			<-变量名 
	* 			[1000]		[1001~1002]		<-地址 
	*此时Stu1地址和b地址差值为1记作 K:1001-1000=1,而b大小为2字节记作 M :1001和1002 
	*结构体必须满足 K % M == 0 所以在地址中会存在填充字节,使其符合该条件! 
	*-------------------------------------------------------------------------------------------
	* 注:*代表填充字节 
	* Stu1    	  [a]	  [*] 	    [b]		    <-变量名 
	* 			[1000]	[1001]	[1002~1003]		<-地址 
	* 此时 K=2 : Stu1和b差值 1002-1000=2	 M=2 : b所占字节 2 
	*满足 K % M == 0 (2 % 2 == 0);
	*实际上 K就是首地址的偏移量 
	*因此 Stu1实际大小为  1+1+2=4  包含一个填充字节 
	*------------------------------------------------------------------------------------------- 
	*同理:Stu2的大小为8,而不是5! 同时也保证8是最宽基本类型宽度(int)的整数倍
	*/ 
	printf("b相对于A的偏移量K1 = %d\nd相对于B的偏移量 K2 = %d\n",((int)&A.b-(int)&A),((int)&B.d-(int)&B));
	printf("偏移量K1除以b的宽度 = %d\n偏移量K2除以d的宽度 = %d\n",((int)&A.b-(int)&A)%sizeof(A.b),((int)&B.d-(int)&B)%sizeof(B.d));
	struct Stu3{
		char e;
		double f;
		int g;
	}C;
	printf("C的长度:%d\n",sizeof(C));	//包含 1(char) + 7(填充字节) + 8(double) + 4(填充字节) = 24 
	//注:如果没有最后4个填充字节,长度是20,但不是最宽基本类型(double)的整数倍,所以需要加4个字节 
	struct Stu4{
		char h;
		struct Stu2 i;		// 属于结构体嵌套,需要将内层结构体展开,判断最宽基本类型的宽度:D.i.d是上面定义的int类型,因此是Stu4中的最宽类型
	}D; 
	printf("D的长度:%d\n",sizeof(D));	//D长度为12  且为int类型的整数倍 
	/* D中最宽的基本类型成员是 D.i.d  属于int型长度为4个字节
	*1,D的首地址必须被4整除 
	*2,D的长度必须被4整除 
	*3,D.i.d相对于D的偏移量必须是D.i.d长度的整数倍 		偏移量:8	D.i.d长度:4 
	*由Stu2数据类型可知:
	*1,D.i 的地址能够被 Stu2中最宽基本类型宽度 4整除 
	*2,D.i 的长度能够被 Stu2中最宽基本类型宽度 4整除 
	*3,D.i.d相对于Stu2的偏移量必须是D.i.d长度的整数倍		偏移量:4	D.i.d长度:4 
	*/
	return 0; 
}

你可能感兴趣的:(c语言,开发语言)