C++の配列覚え書き

  • 誤ったインデックスを参照することについて

配列のインデックスで大きすぎる値を指定するとコンパイル時に以下のwarningがでる。 (なお、宣言でa[100]と書くとa[0]からa[99]までのメモリが確保されることに注意。)

int a[100];
a[100] = 3;        // => warning: array index 100 is past the end of the array (which contains 100 elements) [-Warray-bounds]

これでコンパイル時にwarningを吐くが、コンパイル自体はできてしまう。 実行すると、そのアドレスを見に行っちゃったり、「見に行っちゃダメだよ」というエラー(segmentation fault)がでたりする。

  • 配列の宣言について

配列を宣言するには少なくとも長さを指定する。

int a[];        // => error: definition of variable with array type needs an explicit size or an initializer

可変長配列を初期化することはできない。

int n = 100;
int a[n] = {1, 2, 3};        // => error: variable-sized object may not be initialized

定数でも、変数由来で値を決めたりしてると可変長扱いでダメらしい。

int n;
const int N = n;
int a[N] = {1, 2, 3};        // => error: variable-sized object may not be initialized

= {}と書いて初期化すると、自動的にゼロで補完してくれる。

int a[5] = {};
for (int i=0; i<5; i++) { printf("%d ", a[i]);}        // => 0 0 0 0 0