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 } }
|
阅读(1152) | 评论(0) | 转发(0) |