免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9339 | 回复: 9
打印 上一主题 下一主题

struct, 这是初始化? struct的初始化方法有多少种?(c语言) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-28 09:43 |只看该作者 |倒序浏览
struct RtpHeaderStruct   
{   
    u_int32 version : 2;    // protocal version   
    u_int32 padding : 1;    // padding flag - for encryption   
    u_int32 extension : 1;  // header extension flag   
    u_int32 count : 4;      // csrc count   
    u_int32 marker : 1;     // marker bit - for profile   
    u_int32 type : 7;       // payload type   
    u_int32 sequence : 16;  // sequence number of this packet   
    RtpTime timestamp;      // timestamp of this packet   
    RtpSrc ssrc;            // source of packet   
    RtpSrc startOfCsrc;     // list of contributing sources   
};   
typedef struct  RtpHeaderStruct  RTP_HEADER;

论坛徽章:
0
2 [报告]
发表于 2010-08-28 09:46 |只看该作者
这是bit field...

论坛徽章:
0
3 [报告]
发表于 2010-08-28 09:53 |只看该作者
额~~答案如楼上所说
楼主还是看完书再来问问题吧………………

论坛徽章:
0
4 [报告]
发表于 2010-08-28 10:00 |只看该作者
你认为是初始化?为什么不写个程序,测试一下呢?

论坛徽章:
0
5 [报告]
发表于 2010-08-28 10:13 |只看该作者
这不是初始化吧。初始化的方法书上已经说明了啊

论坛徽章:
0
6 [报告]
发表于 2010-08-28 10:18 |只看该作者
这叫 struct 的定义

论坛徽章:
0
7 [报告]
发表于 2010-08-28 10:59 |只看该作者
声明了一个结构.然后定义了别名.

论坛徽章:
0
8 [报告]
发表于 2010-08-28 11:03 |只看该作者
回复 7# zhangsuozhu


    我想问的是 bit field的, 结贴。

论坛徽章:
0
9 [报告]
发表于 2010-08-28 11:05 |只看该作者
回复 8# keneth2078


    哦.

论坛徽章:
0
10 [报告]
发表于 2010-08-28 16:49 |只看该作者
本帖最后由 matry_wu 于 2010-08-28 16:55 编辑

一点测试代码。
编译器:gcc4.1.2。
测试代码:
  1. #include <stdio.h>
  2. #include <string.h>

  3. struct t1_t
  4. {
  5.     int a : 3;
  6.     int b : 4;
  7.     int c : 7;
  8.     int d : 1;
  9.     int e : 16;
  10.     int f : 2;
  11. };

  12. void printfBit(int num)
  13. {
  14.     for (int i = 31; i >=0; i--)
  15.     {   
  16.         if (num & 1 << i)
  17.         {   
  18.             printf("1");
  19.         }   
  20.         else
  21.         {   
  22.             printf("0");
  23.         }   

  24.         if (i % 8 == 0)
  25.         {   
  26.             printf(" ");
  27.         }   
  28.     }   
  29.     printf("\n");
  30.     return;
  31. }

  32. int main(int argc, char **argv)
  33. {
  34.     t1_t t1;
  35.     memset( &t1, 0, sizeof(t1));
  36.     t1.a = 0x0;
  37.     t1.b = 0xffffffff;
  38.     t1.c = 0x0;
  39.     t1.d = 0xffffffff;
  40.     t1.e = 0xffffffff;
  41.     t1.f = 0xffffffff;
  42.     printf("sizeof t1 %d\n", sizeof(t1));
  43.     int size = sizeof(t1);
  44.     for ( int i = size / 4 - 1; i >= 0; i-- )
  45.     {   
  46.         printfBit(*((int *)(&t1) + i));
  47.     }   
  48.     printf("t1.a %x, t1.b %x, t1.c %x, t1.d %x, t1.e %x, t1.f %x\n", t1.a, t1.b, t1.c, t1.d, t1.e, t1.f);
  49.     return 0;
  50. }
复制代码
测试结果:
  1. sizeof t1 8
  2. 00000000 00000000 00000000 00000011
  3. 01111111 11111111 11000000 01111000
  4. t1.a 0, t1.b ffffffff, t1.c 0, t1.d ffffffff, t1.e ffffffff, t1.f ffffffff
复制代码
结论:

1. bitfield 按32位对齐。

2. bitfiild 不支持长度为0的位段。不支持未命名位段。否则编译出错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP