零长度结构:指针指向什么?

时间:2020-09-10 19:45:24

标签: c struct memory-management

我一直在和C玩耍,碰到过这种情况。

有两个零宽度结构CD,其中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

1 个答案:

答案 0 :(得分:2)

&a和&b地址指向什么?

&a是类型C的结构的地址,而&b是类型D的结构的地址。就像结构的大小为非零一样。为什么会有什么不同?

为什么它们之间有一个字节的偏移量?

因为该标准要求两个单独的值不能具有相同的地址。但是,&a位置的单个字节当然不是a本身的一部分;填充是强制编译器插入的。

难道它们都不都是null指针吗?

不。为什么要这样?存在名为ab的结构。它们不包含任何数据这一事实不影响它们的存在。 &aa的地址;期望&a为空就像期望能够执行*(NULL)而不会调用未定义的行为。