首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问一个结构体长度有关问题

2013-11-29 
请教一个结构体长度问题有个结构体struct sdshdr {long lenlong freechar buf[0]}我输出sizeof(long)

请教一个结构体长度问题
有个结构体
struct sdshdr {
    long len;
    long free;
    char buf[0];
};
我输出sizeof(long)为4,输出sizeof(struct sdshdr)为什么是8呢?
不是long+long+char等于4+4+4=12吗?

[解决办法]
结构体有对齐的问题,参考http://blog.csdn.net/shenbin1430/article/details/4292463

引用:
有个结构体
struct sdshdr {
    long len;
    long free;
    char buf[0];
};
我输出sizeof(long)为4,输出sizeof(struct sdshdr)为什么是8呢?
不是long+long+char等于4+4+4=12吗?

[解决办法]
char buf[0] 不就是0吗 , 4+4 不等于8吗
[解决办法]
char 是 0 个, 不计算空间了,这种结构通常都是变长的, sizeof 的大小不一定是使用时候的大小。
[解决办法]
推荐一下这篇博客,相当不错:http://blog.csdn.net/21aspnet/article/details/6729724
看完之后我可以保证你不会疑惑字节对齐了。

[解决办法]
引用:
Quote: 引用:

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

你是说它没有元素?那是不是这个char[0]的存在是不是没有意义了?这个是不是不能指向malloc申请的空间了?


有意义,它表示了这个结构体是变长的,而且实际使用的时候也是可以取这个成员的。 搜索: C 变长结构体
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

char buf[0] 不就是0吗 , 4+4 不等于8吗

Ding.....

如果char buf[0]是0,那么它怎么指向申请的内存空间呢?求解。。

你把数组和指针的概念搞混淆了,这里数组的长度是0, 你sizeof(asdshdr.buf)时返回的也是0,表示的是数组的长度,当用buf指向申请的内存空间是,是把数组名退化成指针来使用,他指向的是紧随asdsdr之后的那块内存,这个指针不存在于asdsdr中,可以把它当陈一个临时变量。
[解决办法]
buf成员对程序没有什么意义,它只是起到填补空间以达到字节对齐的目的,当然即使不加这个成员通常编译器也会给我们自动填补对齐,我们自己加上它只是起到显式的提醒作用.因为long long各占4字节,不存在字节对齐的问题,所以char buf[0]不占用空间

热点排行