[英]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.