2015-02-11 70 views
2

給定兩個結構聲明爲正在轉換爲嵌套結構指針安全嗎?

struct _inner { 
    char *inner_value; 
}; 

struct _outer { 
    struct _inner common; 
    char *outer_value; 
}; 

我可以假設,從struct _outer *struct _inner*以下投將在每個編譯成功嗎?

struct _outer *outer_struct; 
struct _inner *inner_struct = (struct _inner *)outer_struct; 

什麼是C的最低標準版本,這個演員陣容保證成功?

EDIT:我在外部結構中將struct _one更改爲struct _inner

+0

'_outer'沒有'_inner',那麼我們應該假定它是typedef到'_one'? – 2015-02-11 12:03:35

+0

如果你重新定義了struct _outer {char * outer_value; struct _one common;}'沒有問題,但是現在不好。 – 2015-02-11 12:03:58

+1

請注意,雖然這可以保證在C標準的後續版本中起作用,但此保證的添加是編纂現有慣例的一個例子。 – 2015-02-11 12:09:24

回答

2

像那樣的鑄造保證C99標準中取得成功:

6.7.2.1-13 :指向適當轉換的結構對象的指針指向其初始成員(或者如果該成員是位域,則指向它所在的單位),反之亦然。結構對象中可能有未命名的填充,但不在其開頭。

+0

結構中的結構中的結構也是如此嗎? – Jin 2016-12-01 23:44:54

0

當然你可以施放它。但是,如果你想成爲char *inner_value;char *outer_value;能夠訪問你需要_outer改變順序:

struct _outer { 
    char *outer_value; // <----| 
    struct _one common; // <---| 
};