为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充?
为了确保分配连续的结构数组时正确对齐,结构可能有这种尾部填充(也可能是内部填充)。即使结构不是数组的成员,尾部填充也会保持,以便sizeof能够总是返回一致的大小。
既然数组名可以用作数组的基地址,为什么对结构不能这样?
导致数组引用“退化”为指针的规则只适用于数组。这反映了他们在C语言中的“二级”状态。(类似的规则也适用于函数)而结构确实一级对象,当你提到结构的时候,你会得到的是整个结构。
程序正确运行,但是退出时却“core dump(核心转储)”了,怎么回事?
struct list{
char * item;
struct list *next;
}
main(argc,argv)
{
}
结构声明的末尾缺少的一个分号使mian被定义为返回一个结构。(由于中间的注释行,这个联系不容易看出来)。因为,一般而言,返回结构的函数在实现时,会加入一个隐含的指针,这样产生的main函数代码试图接受3个参数,而实际上只有两个传入。
结构和联合有什么区别?
联合本质上是一个成员相互覆盖的结构,某一时刻只能使用一个成员(也可以从一个成员写入,然后从另一个成员读出,来检查某种类型的二进制模式,或者用不同的方法解释他们。但是很明显,这样做跟机器紧密相关。)联合的大小是它的最大成员的大小,而结构的大小是所有成员的大小之和。
有没有一种自动方法来跟踪联合的哪一个域在使用?
没有。你可以自己实现一个显示带标签的联合:
struct taggedunion{
enum{UNKONWN,INT,LONG,DOUBLE,POINTER}code;
union{
int i;
long l;
double d;
void *p;
}u;
};
当你编写该联合时,必须保证code域总能被正确设置,编译器不能自动为你做这些事情。