C语言中结构体的大小的计算方法

c语言中简单数据类型的字节数

类型 名称 字节数
bool 布尔型 1
char 字符型 1
short int 短整型 2
int 整型 4
long int 长整型 4
float 单精度型 4
double 双精度型 8

c语言中定义一个简单的结构体类型

 struct SimpleTypeSet{
    int nType;
    double dbType;
    char szType;
 };

针对上述定义的结构体,我们知道nType占4个字节,dbType占8个字节,szType占1个字节,那么整个SimpleTypeSet占13个字节。下面通过程序来测试一下,测试的方法是使用sizeof函数。

int getSize(SimpleTypeSet var){
	int size = 0;
	size = sizeof(var);
	return size;
}

int main(int argc, char* argv[]){
	typeSet ts;
	cout<<&ts<<endl;//起始地址
	cout<<&ts.nType<<endl;
	cout<<&ts.dbType<<endl;
	cout<<(void*)&ts.chType<<endl;//'&'取字符型变量的地址
	cout<<&ts.flType<<endl;
	cout<<getSize(ts)<<endl;
	return 0;
}

运行程序,效果如图所示。
计算结构体大小

简要分析程序结果

从程序运行的结果来看,结构体SimpleTypeSet占用的空间是24个字节,而非13个字节。问题出在哪里呢?
这涉及结构体的字节对齐问题。在给结构体分配内存空间时,按内部定义的变量的顺序进行存储,并且要保证每个变量的起始地址是其字节数的整数倍,除此之外,还要保证结构体所占字节数是结构体中占字节数最大的变量所占字节数的整数倍。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

假定nType从0位置开始存储,占据0,1,2,3四个位置的内存,下一个变量dbType跳过4,5,6,7四个位置直接从8位置开始存储,因为位置8是其字节数8的整数倍,其占据8,9,10,11,12,13,14,15八个位置的内存,接下来变量szType占据16一个位置的内存,现在一共占据了十七个位置的内存,但是17不是最大字节8数的整数倍,所以位置17,18,19,20,21,22,23七个位置也被结构体占据了,一共24个字节。

发布了5 篇原创文章 · 获赞 0 · 访问量 590

猜你喜欢

转载自blog.csdn.net/zxq201400689/article/details/89212320