簡體   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