【发布时间】:2020-09-10 19:45:24
【问题描述】:
我一直在玩 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
【问题讨论】:
-
这可能是因为最小的分配单元是一个字节。如果它们是 NULL 指针,它们就不会“存在”。
-
仅供参考,在严格符合 C 的情况下,结构声明不应为空。
struct C {}是 C++ 或编译器扩展。 -
一个有趣的实验是定义这些数组并查看其大小。 更新:事实上只是做了它,它是零,从指针算术的角度来看这是有道理的。
-
@EugeneSh.:这很有趣,因为这意味着
&a[0]和&a[1]必须具有相同的地址,这违反了 C 2018 6.5.8 5 中指向具有更大下标的数组元素的规则值比较大于指向具有较低下标值的元素的指针。 -
@EricPostpischil 是的,正是我在答案下评论的内容。在我的实验中,这些确实是相等的。
标签: c struct memory-management