user-0 提问: 请教一个结构体长度问题

回复:
user: user-0
content: 引用 6 楼 baijiaheizhiganmao 的回复:推荐一下这篇博客，相当不错：http://blog.csdn.net/21aspnet/article/details/6729724 看完之后我可以保证你不会疑惑字节对齐了。 谢谢

user: user-0
content: 引用 8 楼 adlay 的回复:[quote=引用 4 楼 yiyamzen 的回复:] [quote=引用 3 楼 adlay 的回复:] char 是 0 个, 不计算空间了，这种结构通常都是变长的, sizeof 的大小不一定是使用时候的大小。 你是说它没有元素？那是不是这个char[0]的存在是不是没有意义了？这个是不是不能指向malloc申请的空间了？[/quote]  有意义，它表示了这个结构体是变长的，而且实际使用的时候也是可以取这个成员的。 搜索： C 变长结构体[/quote] 3Q~

user: user-0
content: 引用 9 楼 Automation_dmu 的回复:[quote=引用 7 楼 yiyamzen 的回复:] [quote=引用 5 楼 Chen8013 的回复:] [quote=引用 2 楼 Automation_dmu 的回复:] char buf[0] 不就是0吗 , 4+4 不等于8吗 Ding.....[/quote] 如果char buf[0]是0，那么它怎么指向申请的内存空间呢？求解。。[/quote] 你把数组和指针的概念搞混淆了，这里数组的长度是0， 你sizeof(asdshdr.buf)时返回的也是0，表示的是数组的长度，当用buf指向申请的内存空间是，是把数组名退化成指针来使用，他指向的是紧随asdsdr之后的那块内存，这个指针不存在于asdsdr中，可以把它当陈一个临时变量。[/quote] 明白了，谢谢。

user: user-1
content: buf成员对程序没有什么意义,它只是起到填补空间以达到字节对齐的目的,当然即使不加这个成员通常编译器也会给我们自动填补对齐,我们自己加上它只是起到显式的提醒作用.因为long long各占4字节，不存在字节对齐的问题，所以char buf[0]不占用空间

user: user-2
content: 引用 7 楼 yiyamzen 的回复:[quote=引用 5 楼 Chen8013 的回复:] [quote=引用 2 楼 Automation_dmu 的回复:] char buf[0] 不就是0吗 , 4+4 不等于8吗 Ding.....[/quote] 如果char buf[0]是0，那么它怎么指向申请的内存空间呢？求解。。[/quote] 你把数组和指针的概念搞混淆了，这里数组的长度是0， 你sizeof(asdshdr.buf)时返回的也是0，表示的是数组的长度，当用buf指向申请的内存空间是，是把数组名退化成指针来使用，他指向的是紧随asdsdr之后的那块内存，这个指针不存在于asdsdr中，可以把它当陈一个临时变量。

user: user-3
content: 引用 4 楼 yiyamzen 的回复:[quote=引用 3 楼 adlay 的回复:] char 是 0 个, 不计算空间了，这种结构通常都是变长的, sizeof 的大小不一定是使用时候的大小。 你是说它没有元素？那是不是这个char[0]的存在是不是没有意义了？这个是不是不能指向malloc申请的空间了？[/quote]  有意义，它表示了这个结构体是变长的，而且实际使用的时候也是可以取这个成员的。 搜索： C 变长结构体

user: user-0
content: 引用 5 楼 Chen8013 的回复:[quote=引用 2 楼 Automation_dmu 的回复:] char buf[0] 不就是0吗 , 4+4 不等于8吗 Ding.....[/quote] 如果char buf[0]是0，那么它怎么指向申请的内存空间呢？求解。。

user: user-4
content: 推荐一下这篇博客，相当不错：http://blog.csdn.net/21aspnet/article/details/6729724 看完之后我可以保证你不会疑惑字节对齐了。

user: user-5
content: 引用 2 楼 Automation_dmu 的回复:char buf[0] 不就是0吗 , 4+4 不等于8吗 Ding.....

user: user-0
content: 引用 3 楼 adlay 的回复:char 是 0 个, 不计算空间了，这种结构通常都是变长的, sizeof 的大小不一定是使用时候的大小。 你是说它没有元素？那是不是这个char[0]的存在是不是没有意义了？这个是不是不能指向malloc申请的空间了？

user: user-3
content: char 是 0 个, 不计算空间了，这种结构通常都是变长的, sizeof 的大小不一定是使用时候的大小。

user: user-2
content: char buf[0] 不就是0吗 , 4+4 不等于8吗

user: user-6
content: 结构体有对齐的问题，参考http://blog.csdn.net/shenbin1430/article/details/4292463  引用 楼主 yiyamzen 的回复:有个结构体 struct sdshdr {     long len;     long free;     char buf[0]; }; 我输出sizeof(long)为4，输出sizeof(struct sdshdr)为什么是8呢？ 不是long+long+char等于4+4+4=12吗？

user: user-7
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //