Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1644310
  • 博文数量: 311
  • 博客积分: 7778
  • 博客等级: 少将
  • 技术积分: 4186
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 19:59
个人简介

蓝点工坊(http://www.bluedrum.cn) 创始人,App和嵌入式产品开发。同时也做相应培训和外包工作。 详细介绍 http://pan.baidu.com/s/1y2g88

文章存档

2012年(3)

2011年(115)

2010年(170)

2009年(23)

分类: C/C++

2010-03-07 02:07:40

1。关于空结构。
   一般的书籍提到sizeof()的结果是1.原因是这样保证结构定义有一个确定的值。参见如下代码

/* Author: Andrew Huang */
#include <stdio.h>

struct empty_str{
/*    int data; */
};

#define PRINT_INT(e) printf("%s=%d\n",#e,e)
#define PRINT_INTX(e) printf("%s=%x\n",#e,e)

void test1()
{
     struct empty_str str;
     PRINT_INT(sizeof(struct empty_str));
     PRINT_INTX(&str);
}

 
   在VC++ 6.0 测试 C语言下空结构是编译错误,,用C++编译得出sizeof=1,结果如下
sizeof(struct empty_str)=1
&str=12ff28

 
用gcc 编译c语言版本.结果是0,
sizeof(struct empty_str)=0
&str=bfce8dc8
 
 用g++测试的cpp版本,结果一致
 
sizeof(struct empty_str)=1
&str=bfc70557
但是在RHEL 5/GCC 4.12 下测试 sizeof 为0.
 
2.double 的字节对齐。
 这个讲字节对齐都会提到这个差异.在WINDOWS下,double使用8字节对齐,在LINUX使用4字节对齐。
   

/* Author: Andrew Huang */
#include <stdio.h>

struct empty_str{
    int data;
};

#define PRINT_INT(e) printf("%s=%d\n",#e,e)
#define PRINT_INTX(e) printf("%s=%x\n",#e,e)


struct double_str1{
    short a;
    double b;
    char c;
};

void test2()
{

     PRINT_INT(sizeof(struct double_str1));
    
}


struct double_str1的在Windows下测试的sizeof的值是 24.Linux 下测试sizeof值是16.原因是WIndows 采用8对齐,这样要在a后面补6个byte,c后面补7个bye才能满足8对齐.而Linux是对齐,因此在a后补了2个byte,在c后面补了3个byte.

 

3.标记化结构初始化语法

在标准C中(C89(结构标准初始化是用{}来实始化,在C99的版本,采用了采用可读性更强的标记化实始化,这在LINUX内核和驱动很为常见。

其中VC++ 6.0只支持C89初始化,GCC支持自己标记化或自己扩展初始化。这种初始化采用 .name = value.这样不需要按顺序排序,方便调整实义,在大结构最大程度防止错位的和调整定义带来不便

struct name_str{
 int data;
 char name[120];
 int num;
};
/* 标记式初始化,注意顺序不同,并可缺省 */
struct name_str str ={
  .num = 100;
  .name = "hxy";
  
};

/* C89 初始化 */

struct name_str str2 =
{
 100,"Andrew Huang",-2
};

/* gcc 扩展初始化 */
struct name_str str3 =
{
  name:"bluedrum";
  data:-1
}
}


阅读(1093) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~