有朋友问:
1.下列程序中,结构体变量n所占内存字节数是(答案为6?)
union U
{
char s[4];
int i;
long l;
};
struct A
{
int c;
union U u;
}a;
2.若有下面的说明和定于:
struct test
{
int m1;char m2;float m3;
union uu{ char u1[5];int u2[2];} ua;
}myaa;
则sizeof(struct test)的值是(答案为12?)
3.在16位的PC机上使用c语言,若有如下定义:
struct data
{
int i;
char ch;
double f;
}b;
则结构变量b占用内存的字节数是(答案为11?)
答复:
如果你这是考试用题,建议你采用这个方式来计算:
1、假设是在16位IBM-PC机上计算所占用内存的字节数,决定了各类型的宽度;
2、union(共用体)变量的所占用内存的字节数为变量类型定义的变量的最大宽度变量;
3、如果有数组要考虑数组的宽度(比如char[3]肯定小于int[2],cha[5]就按5个字节算,因为大于了int[2]);
4、结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和;
5、结构体里有结构体也要按照上面的方法计算。
那么,由于假设16位IBM-PC机,所以:
char:1字节、short:2字节、int:2字节、long:4字节、long long(即long long int):4字节、float:4字节、double:8字节、long doubule:10字节
这样你就好计算了:
题目1:union U u; u的宽度为最大char s[4];的4个字节,int c;2个字节。所以结果为6个字节。
题目2、题目3你自己应该就会算了吧?
有个问题还是要补充一下,在现在我们用的IDE在实际环境中,由于为了实现更快寻址和达到性能更优的原因,会有本机宽度和字节对齐的情况发生,所以你在你具体应用中会有一些不同情况的出现。另外,long double占用10字节空间,但有的编译器并不认可10字节,还是8字节,比如在VC++6.0下,用sizeof(long double)测出来的值仍然是8。所以我强调了第1点假设是在16位IBM-PC机上,而且估计你提的这几个问题都是考试用的,所以就按我上面说的方法去计算就可以。