这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 结构体的sizeof问题

共10条 1/1 1 跳转至

结构体的sizeof问题

菜鸟
2013-08-20 09:58:09     打赏

结构体的sizeof问题

 

在很多项目开发过程以及诸多名企入职笔试题里面都有对结构体求sizeof的问题,笔者总结了一下几点,希望可以为大家提供有效参考。

 

  • sizeof有三种语法形式,如下:

ⅰ、sizeof(object_name);    //sizeof(对象);

ⅱ、sizeof(type_name);  //sizeof(类型);

ⅲ、sizeof object_name; //sizeof 对象;
 

注意:sizeof是一个运算符,在C语言中是一个关键字,并不是函数,要和strlen区分开来。sizeof是求取所占的存储空间的所有字节数。

  • sizeof与结构体的使用,先来看下面的例子:

typedef struct
{
    int a;
    char b;
}A_t;
typedef struct
{
    int a;
    char b;
    char c;
}B_t;
typedef struct
{
    char a;
    int b;
    char c;
}C_t;
int main(int argc, char *argv[])
{
    char *a=0;
    printf(“%d\n”, sizeof(a));     //输出结果:4
    printf(“%d\n”, sizeof(*a));    //输出结果:1
    printf(“%d\n”, sizeof(A_t));   //输出结果:8
    printf(“%d\n”, sizeof(B_t));   //输出结果:8
    printf(“%d\n”, sizeof(C_t));   //输出结果:12 

   return 0;
}
 

为什么会有如上的结果呢?这和字节对齐有关,当然还和硬件平台有关,也和编译器有关。就一般情况而言,主要有以下三个原则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍, 
   如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最

   末一个成员之后加上填充字节(trailing padding)。

在字节对齐的时候有的时候是需要字节填充的,那这是为什么呢?大家不防想一想,在C语言中基本的数据类型都有一定的存储大小,那么来看一下下面的这个例子:

struct stu{
    char a;
    int b;
};
假设int类型占有4个字节的大小,则sizeof(struct stu)的大小就为8,根据上面的三条分析和基本类型的存储宽度可知,在成员a的后面会补上三个字节,然后才存放成员b,即总共占了8个字节。

  • sizeof和含有位域的结构体的使用:

位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。
C99规定int、unsigned   int和bool可以作为位域类型,但编译器几乎都对此作了扩展,
允许其它类型类型的存在。
使用位域的主要目的是压缩存储,其大致规则为:
1)   如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字
段将紧邻前一个字段存储,直到不能容纳为止;
2)   如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字
段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3)   如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4)   如果位域字段之间穿插着非位域字段,则不进行压缩;
5)   整个结构体的总大小为最宽基本类型成员大小的整数倍。 

让我们来看如下的例子:
struct stu{
    char   a:3;
    char   b:4;
    char   c:5;
};

则sizeof(struct stu)的大小在gcc上面得到的结果为2,在visual c上得到的结果也为2。根据以上五条,还有前面讲的对齐,可以得出结果为2个字节。我们再来看下如下的例子:

struct stu{
    char   a:3;
    int    b:4;
    char   c:5;
};
则sizeof(struct stu)的大小在gcc上面得到的结果为4,在visual c上得到的结果为12。根据以上五条,还有前面讲的对齐,可以推出这样的结果,请着重看下第三条,就可以知道visual c和gcc分别得到不同结果的原因了。

 


 





关键词: 武汉     华嵌     结构     sizeof    

高工
2013-08-20 11:19:33     打赏
2楼
广告打的够辛苦的

专家
2013-08-20 12:15:37     打赏
3楼

专家
2013-08-20 21:52:32     打赏
4楼
内容很有用,倒是会推荐学习C的好好看看,这个是程序员笔试时经常出现的问题,写的不错

助工
2013-08-22 13:31:22     打赏
5楼
学习了,原来学C的时候弄个,玩处理器的时候到真没有这么分析过,看来还得把学过的知识捡回来呀

院士
2013-08-22 13:52:45     打赏
6楼

这个还是灰常实用的。


高工
2013-08-25 14:06:23     打赏
7楼
非常有用,如果结构体内部成员顺序不好好安排的话,会平白浪费很多空间,当定义结构体数组的时候效果特别明显。

高工
2013-08-25 22:31:21     打赏
8楼
越来越发现结构体的重要了,板凳学习。

高工
2013-08-26 00:10:53     打赏
9楼
这个几个问题我在面试的时候也遇到过,一模一样

高工
2013-08-26 10:38:27     打赏
10楼

对于sizeof以前还真没这么仔细琢磨过。。长知识了


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]