以下のコードでは、gcc
はインデックスについて警告していません。その理由は何ですか?int(* foo)[3]のインデックス4にアクセスすると警告が表示されない
int foo[3] = {1,2,3};
int (*bar)[3];
int main(void) {
bar = &foo;
foo[42] = 42;
(*bar)[42] = 42;
return 0;
}
私だけbar
ためfoo
ないためにエラーが発生します。どうして?
$ gcc -std=c99 -Wall -O2 -Wpedantic -Wextra test.c
test.c: In function ‘main’:
test.c:6:8: warning: array subscript is above array bounds [-Warray-bounds]
foo[42] = NOPE;
^
注
私はbar = foo
を書かれており、int* bar
としてbar
を宣言したが、私はしませんでしたと...他のよりも一つの解決策優れている理由を私は知らないが、これは別であることができました面白い質問。
ポインタは、単にメモリアドレスです。それはそれが限界であることとそれが取ることができる値を知っているいくつかの高水準のオブジェクトではありません。コンパイラは実際にfoo [3]を過ぎた次のメモリ位置を指しているかどうかを知る方法がありませんでした。他の場所でもありません。任意の値をポインタに割り当てることができます。それが何を指しているかは、あなたの責任です。 –
clang 3.9.0は、両方の場合について警告します。 IMOそれはコンパイラのバグです。なぜなら、 'bar'は3つのポインタの配列であり、' foo'は3つの 'int'sの配列です。 –
@MichaelWalz' bar'は3の 'int'の配列へのポインタです。 3ポインタの配列。 – mch