您的位置:首页 > 编程语言 > C语言/C++

C语言结构体

2013-11-07 19:16 381 查看
针对C语言结构的一些记录,方便日后查询

A. 计算结构体成员的偏移位置

(1) 采用C库的的API , offsetof

测试程序如下:

int main(int argc, char *argv[])

{

struct s {

int i;

char c;

double d;

char a[];

};

/* Output is compiler dependent */

printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",

(long) offsetof(struct s, i),

(long) offsetof(struct s, c),

(long) offsetof(struct s, d),

(long) offsetof(struct s, a));

printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));

exit(EXIT_SUCCESS);

}

运行结果:

offsets: i=0; c=4; d=8 a=16

sizeof(struct s)=16

(2)

#define UNIX_PATH_MAX 108

struct sockaddr_un {

sa_family_t sun_family; /* AF_UNIX */

char sun_path[UNIX_PATH_MAX]; /* pathname */

};

#define SUN_LEN(ptr) ((size_t)(((struct sockaddr_un *)0)->sun_path)
\

+ strlen((ptr)->sun_path))

上面的宏是计算sun_path成员在struct sockaddr_un{}结构中的偏移位置,后面部分是计算sun_path数组中字符串的长度

B. 改变结构体对其的长度,默认X86架构都是以四字节对齐,比如下面的程序:

#pragma pack(push)

#pragma pack(4)

struct stu

{

int a;

int b;

char c;

};

#pragma pack(pop)

int main(int argc, char *argv[])

{

printf("%d\n",sizeof(struct stu));

return 0;

}

运行结果:

./pragma_pack_test

12

当上面的#pragma pack(4) 修改成 #pragma pack(2)时,运行结果为10

当修改为#pragma pack(1)时,其运行结果为9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: