C语言中字符对齐(内存对齐)问题(测试环境visual studio 2010)


自然对界:一个变量的内存地址正好位于它长度的整数倍


有关结构的字符对齐方式:

结构体内的变量按照自然对界对齐,数组如char a[10]的自然对界是1Byte。

结构体按照结构体内最大的自然对界进行对齐

例子:

struct test{
	int g;
	char w[10];
	double l;
	char gwl;
};

int _tmain(int argc, _TCHAR* argv[])
{
	printf("%d",sizeof(struct test));
	getchar();
	return 0;
}
运行结果:32 

32 = 4+10+(2+8)+1+7

有关union的字符对齐方式:

按照union内成员最大的自然对界进行对齐

整个union大小为占空间最大的成员按上述对齐方式对齐后的大小

例子:

union test{
	int g;
	char w[10];
	double l;
	char gwl;
};

int _tmain(int argc, _TCHAR* argv[])
{
	printf("%d",sizeof(union test));
	getchar();
	return 0;
}
运行结果:16

按照double的自然对界进行对齐,union的大小为成员char w[10]的大小


关于自己定义字符对齐方式

#pragma pack(n)
.
.代码
.
#pragma pack()//取消自定义对齐方式
结构体中成员对齐方式为n与自然对界中较小的(union相同,最后取成员中最大的对齐方式)

例子:

#pragma pack(2)

struct test{
	int g;
	char w[10];
	double l;
	char gwl;
};

int _tmain(int argc, _TCHAR* argv[])
{
	printf("%d",sizeof(struct test));
	getchar();
	return 0;
}
#pragma pack()
运行结果:24

24 = 4+10+8+1+1



你可能感兴趣的:(C语言)