[英]Zero length struct: what's the pointer pointing at?
我一直在玩 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
&a 和 &b 地址指向什么?
&a
是C
类型结构的地址, &b
是D
类型结构的地址。 这与结构具有非零大小的情况相同。 为什么会有所不同?
为什么它们之间有一个字节的偏移量?
因为标准要求两个不同的值不能有相同的地址。 但是&a
位置的单个字节当然不是a
本身的一部分; 它填充编译器被迫插入。
他们不应该都是
null
指针吗?
不,为什么要这样? 存在名为a
和b
的结构。 它们不包含任何数据这一事实并不影响它们的存在。 &a
是的地址a
; 期望&a
为 null 就像期望能够在不调用未定义行为的情况下执行*(NULL)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.