C语言 标准类型中 有 long int 和 short int, 但没有规定 int 长度
一般编译器把 int 处理成 long int ( 4 Bytes), 少数编译器 把 int 处理成 short int ( 2 Bytes),
struct stu
{ short int Number; // 处理成 short , 2 字节
char Name[10];
} a;
sizeof(a) 等于 12
------------------------
struct stu
{ long int Number; // 处理成 long, 4字节
char Name[10]; // 考虑 4 字节对齐,+2
} a;
sizeof(a) 等于 16
======================
sizeof(b)的值 (32位系统) 一般编译器处理成 unsigned long int 得 4
老式编译器, (16位系统) 处理成 unsigned short int 得 2
===
你的题目源于老编译器,老的16位系统,或老旧的教材。
32位系统下,
struct stu
{ int Number;
char Name[10];
} a;
会按int型4字节对齐,Name虽然只定义了10个字节长度,但其实会占用12个字节,所以,sizeof(a)的值应该是16,32位系统下,指针的大小都是4字节,所以,sizeof(b)的值是4。
这种题目前提一定要给清楚,比如按多少字节对齐,是在什么系统上等等。
恐怕sizeof(a)值未必是3,应该好好看下你的代码。
sizeof(b)为4应该正确,因为指针的长度在32位机下为4.
如果是你所说的那样,你用的肯定是TC。
我已经验证过了,一个为16 一个为4.(32位机,gcc4.4)
a四字节对齐,所以应该是16
b是指针,就是4个字节
你那个答案是16位机器,现在上哪找去。。
int 4个字节
char 1个字节
故结构体直接计算大小为4+10=14字节。但C语言中结构体大小需要满足以下两个原则:
一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。
由于14不是4的整数倍,所以编译器补上两个字节,即sizeof(a)=16。
b为指针,不管是指向什么类型的指针,大小通通是4个字节。sizeof(b)=4
注:以上讨论仅限于常见的32位机器。