私の C コンパイラ (gcc) では、次のようなことができることに気付きました。
#include <stdio.h>
main(){
short m[32768];
short y = -1;
short z = -1;
printf("%u\n", y);
m[y] = 12;
printf("%d\n%d\n", y, m[z]);
}
実行すると吐き出します:
4294967295
12
12
これは私には少し不可解に思えます。
まず、このようなプログラムを実行しても安全ですか? 誤ってオペレーティング システムを上書きしてしまう可能性はありますか (関連する場合に備えて OS X を実行しています)。
また、過去に遭遇したような segfault エラーの少なくともいくつかの種類を期待していましたが、このようなエラーを静かに無視することは本当に怖いです。このプログラムがセグメンテーション違反を起こさないのはなぜですか?
そして最後に、好奇心から (これは最もばかげた質問かもしれません)、狂気への方法はありますか? すべての ANSI C コンパイラがこのように動作すると期待できますか? 異なるプラットフォームでの gcc はどうですか? メモリのレイアウトは悪用可能であると明確に定義されていますか (クロスプラットフォームの難読化されたコードを作成する場合など)?