C语言中类型转换和字节对齐

来源:互联网 发布:淘宝店铺免费代码 编辑:程序博客网 时间:2024/04/30 05:27
  这两天浏览了一下《C专家编程》这本经典著作,小有收获,贴出来卖弄一下,呵呵!
  首先是关于类型转换:
  先看这样一段代码:
struct student
{
    int num;
    char name[20];
    char sex;
    int score;
};
void main()
{
    long lTemp = -1;
   
    if(lTemp < sizeof(student))
    {
        printf("-1 is less/n");
    }else
    {
        printf("-1 is larger/n");
    }
}
这段代码的输出结果会是什么呢?应该会有人认为输出“-1 is less”,因为sizeof(student)的值至少是正数,比-1大啊。这是比较正常的,我以前也是这样认为。但事实并非如此。执行这段代码,会发现输出“-1 is larger”。这是为什么呢?
    其实,原因就出在类型转换上。sizeof()函数的返回值是unsigned long型,而lTemp是long型,两者类型不匹配,于是long自动转为unsigned long型,于是-1就变成了一个很大很大的数FFFFFFFF,自然就输出了“-1 is larger”

    其次是字节对齐问题:
    请问上文中sizeof(student)的返回值到底是多少呢?也就是说student这个结构体占用了多少内存呢?
    如果你不知道字节对齐的话,那你的回答很有可能会是4+20+1+4=29个字节。但实际情况并不是这样。在内存中,处理器是以四个字节为单位进行存取 的,student中的成员变量sex定义为char型,但它在内存中却占用了四个字节,只不过是后面三个字节是空的,没被使用而已