:ポインタのキャスティングは実際に厳密なエイリアシングを解除しますか?次のコードで
#include <stdio.h>
int main(void)
{
int n = 74;
int * pn = &n;
short * sp;
//sp = (short *)&n; // <-- bad
sp = (short *)pn; // <-- fine
*sp = 4;
printf("%d\n", *sp);
return 0;
}
厳格なエイリアシング規則が壊れて取得するのですか?私が理解する限り、intへの短い点を指すポインタがあるので、それはします。 (test.cの中にあるコードを仮定して)でコンパイルされた場合でも、コンパイラはラインが悪いがコメント解除されているマークされ、もう1つはコメントしている微細なマークされている場合
gcc test.c -o test.exe -Wall -std=c99 -Wstrict-aliasing=2 -O3
しかし、それは文句を言わなくても文句はありません。
誰かが説明することができますこのケースは本当にルールを破るか?もしそうなら、それはなぜコンパイラによって検出されないのですか?もしそうでなければ、標準によればそれはすべきではないのですか?
コンパイラの警告は、明らかに見えるものであっても、すべてをキャッチしません。 – user2357112
"コンパイラは文句を言っていません" - ネットを使わずにコーディングしてCを歓迎します。 – chux
言語を選択します。 CとC++はここでは若干異なる規則を持っています。 – Lundin