[英]struct casting ansi c 89
嚴格的c 89中對結構的定義是否正確? 我的意思是這段代碼
struct a {
int a, b;
void * c;
} k;
//init k...
struct b {
int u, w;
long *data;
} p = *(struct b*)&k;
將在支持該標准的每個編譯器上工作嗎? 如果我反向轉換(例如從struct b轉換為struct a),c將與開始相同嗎? 我很確定它可以與gcc(甚至與-ansi -pedantic),Microsoft編譯器一起使用,但是可以保證它是標准的c 89嗎?
謝謝!
不要這樣 手動復制字段:
struct b p;
p.u = k.a;
p.w = k.b;
p.data = (long *) k.c;
您的代碼很可能會正常運行,因為long *
和void *
通常會以相同的方式實現,但是為什么要冒險呢? 該標准規定了以下內容:
指向void的指針應與指向字符類型的指針具有相同的表示和對齊要求。39)類似地,指向兼容類型的合格或不合格版本的指針應具有相同的表示和對齊要求。 所有指向結構類型的指針應具有相同的表示和對齊要求。 指向聯合類型的所有指針應具有相同的表示和對齊要求。 指向其他類型的指針不必具有相同的表示或對齊要求。
請注意最后一句話,其中將指向“其他類型”(例如long
)的指針與指向void
指針區void
。
上面的內容是明確的,安全的並且更加清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.