繁体   English   中英

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

[英]Zero length struct: what's the pointer pointing at?

我一直在玩 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

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

&aC类型结构的地址, &bD类型结构的地址。 这与结构具有非零大小的情况相同。 为什么会有所不同?

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

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

他们不应该都是null指针吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM