C语言结构填充

 为什么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域总能被正确设置,编译器不能自动为你做这些事情。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值