- ベストアンサー
配列とポインタについて
ポインタ関係について勉強を始めたら、分からないことが沢山出てきて質問ばかりですが、よろしくお願いします。 strtokを使う時コード1はエラーが出ますがコード2は出ません。 どうしてなのでしょうか? char *zoo = "Cat, Dog, Tiger, Bug"; ←コード1 char zoo[] = "Cat, Dog, Tiger, Bug"; ←コード2 strtok(zoo, " ,");
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
strtokは、与えられた文字列に変化を加えますが、 コード1の場合は元の文字列が書き換え不可な領域に存在します。 コード2の場合、書き換え可能な領域にコピーされているので、エラーは出ません。 コンパイルした実行可能プログラム(Windowsなら.exeファイル)の中には、 どこかに"Cat, Dog, Tiger, Bug"という文字列情報が入っています。 コンピュータは、ディスク上にある実行可能プログラムを メモリ上にコピーしてから実行します。 通常、文字列情報が置かれるのは、メモリの書き換え不可能な領域になっています。 (最近のOSではそうなっています。これにより致命的な暴走を防いでいるのです) つまり"Cat, Dog, Tiger, Bug"という文字列自体は、 図書館にある本のようなものです。 書き込みや切り抜きをしてはいけないことになっています。 コード1の場合、zooが指しているのは文字列情報そのものです。 対してコード2の場合、文字列情報を一度配列zoo[]にコピーしています。 「図書館の本の何ページ目」と、 「図書館の本の何ページ目をコピーした紙」の差のようなものです。 関数strtokは、与えられた文字列に\0を挟むことによって、文字列を分解します。 そのため、もともとの文字列は書き換えられてしまいます。 コード1の場合は、図書館の本を切り張りするようなもので、叱られますが、 コード2の場合、コピーした紙を切り張りするので、ご自由にどうぞというわけです。
お礼
回答ありがとうございます。 大変良く分かりました。