我一直在和C玩耍,碰到过这种情况。
有两个零宽度结构C
和D
,其中D
包含C
。
如我们所见,指向零长度结构b
的指针的地址也比零长度结构a
偏移了一个字节(请参见下面的输出)。
在这种情况下,&a
和&b
地址指向什么?
为什么它们之间有一个字节的偏移量?
难道它们都不都是null
指针吗?
#include <stdio.h>
struct C {};
struct D {
struct C wreck;
};
int main () {
struct C a;
struct D b;
printf("struct C a size %lu stored at %p\n", sizeof(a), &a);
printf("struct D b size %lu stored at %p\n", sizeof(b), &b);
return 0;
}
样本输出:
$ ./struc
struct C a size 0 stored at 0x7ffe05c8b6e6
struct D b size 0 stored at 0x7ffe05c8b6e7
使用的编译器:
$ gcc --version
gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
答案 0 :(得分:2)
&a和&b地址指向什么?
&a
是类型C
的结构的地址,而&b
是类型D
的结构的地址。就像结构的大小为非零一样。为什么会有什么不同?
为什么它们之间有一个字节的偏移量?
因为该标准要求两个单独的值不能具有相同的地址。但是,&a
位置的单个字节当然不是a
本身的一部分;填充是强制编译器插入的。
难道它们都不都是
null
指针吗?
不。为什么要这样?存在名为a
和b
的结构。它们不包含任何数据这一事实不影响它们的存在。 &a
是a
的地址;期望&a
为空就像期望能够执行*(NULL)
而不会调用未定义的行为。