针对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
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