C语言结构体

针对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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值