(Quiz/2年次) プログラミング, OS: 配列の要素数外への不正なアクセス
<blockquote>
#include <stdio.h> int main(int artc, char *argv[]){ int array1[5]; int scalar; scalar = 10; array[5] = 5; // 配列の要素を超えたアドレスへの不正アクセス printf("scalar=%d\n",scalar); // 結果は環境依存で異なる return 0; }
上記ソース memory.c では次のような処理を行っている.
- int 型の配列 array を宣言.配列の要素数は5.
- int 型のスカラー変数 scalar を宣言.
- scalar に10を代入.
- array[5] に 5 を代入.
- printf で scalar の値を確認.
このとき,scalar の値は環境依存で結果が異なってしまう.
私が確認した限りでは以下の通りであった.
OS | gccバージョン | 出力結果 |
Mac OS X 10.5.7 | gcc version 4.0.1 (Apple Inc. build 5490) | scalar=5 |
CentOS release 4.3 (Final) | gcc バージョン 3.4.5 20051201 (Red Hat 3.4.5-2) | scalar=10 |
この結果を踏まえて,以下のクイズに答えよ.
- なぜ結果が環境によって異なるのか?
- それを解決するにはどうすれば良いか? 具体的にはソースをどのように書き直せば良いか?
- このような問題が起きないようにするためのウマい方策は無いだろうか?