1。关于空结构。
一般的书籍提到sizeof()的结果是1.原因是这样保证结构定义有一个确定的值。参见如下代码
/* Author: Andrew Huang <[email protected]> */
#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 <bluedrum#163.com> */
#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
}
}
|