第4章 C言語の配列 ~intの配列とcharの配列~
休憩室
今回も、またまた実験です。20個分のchar配列に20文字ぴったし入れてしまったら、 一体何が起きてしまうのでしょうか?
これは、実際にやってみた方がわかりやすいですね。 次のようなプログラムを作ってみてください。
-- リスト14 --
#include <stdio.h>
#include <string.h>
void main( )
{
char str1[20];
char str2[20];
strcpy(str1, "第4章はC言語の配列");
printf(" str1 = [%s]\n str2 = [%s]\n\n", str1, str2);
strcpy(str2, "C言語研修マニュアル");
printf(" str1 = [%s]\n str2 = [%s]\n", str1, str2);
}
実行結果はどうなりましたか?
str1 = [第4章はC言語の配列]
str2 = [ ]
str1 = [ ]
str2 = [C言語研修マニュアル]
と出てきてると助かります(コンパイラによっては、結果が変わりますから)。 まるで、str1の中身が消えてなくなってしまったようですね。 これは、以下のようなことが原因なのです。
| 他の領域 |
str2[20]の領域 |
文字列 |
他の領域 |
| ? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
第 |
4 |
章 |
は |
C |
言 |
語 |
の |
配 |
列 |
\0 ? |
↓
| 他の領域 |
str2[20]の領域 |
文字列 |
他の領域 |
| ? |
C |
言 |
語 |
研 |
修 |
マ |
ニ |
ュ |
ア |
ル |
\0 |
4 |
章 |
は |
C |
言 |
語 |
の |
配 |
列 |
\0 ? |
となったからです(この場合、後から宣言したstr2が前に存在してます)。
これを、俗にメモリ破壊と呼びます。 str2へのコピーで、意図していないstr1の先頭(第4章の第の前半)を破壊してしまっています。
しかし、まだこの程度は甘い方です。 同じプロジェクトの中で、他の人が使ってる変数まで壊してしまっていたら、 取り返しの付かないことになってしまいます。その人は、原因不明のエラーに悩むことでしょう。
このように文字列処理はたいへん危険なものなのです。 ですから、文字列用のchar配列は、充分なサイズ
(注16) を確保することが大事です。