• ベストアンサー

配列とポインタについて

ポインタ関係について勉強を始めたら、分からないことが沢山出てきて質問ばかりですが、よろしくお願いします。 strtokを使う時コード1はエラーが出ますがコード2は出ません。 どうしてなのでしょうか? char *zoo = "Cat, Dog, Tiger, Bug"; ←コード1 char zoo[] = "Cat, Dog, Tiger, Bug"; ←コード2 strtok(zoo, " ,");

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

strtokは、与えられた文字列に変化を加えますが、 コード1の場合は元の文字列が書き換え不可な領域に存在します。 コード2の場合、書き換え可能な領域にコピーされているので、エラーは出ません。 コンパイルした実行可能プログラム(Windowsなら.exeファイル)の中には、 どこかに"Cat, Dog, Tiger, Bug"という文字列情報が入っています。 コンピュータは、ディスク上にある実行可能プログラムを メモリ上にコピーしてから実行します。 通常、文字列情報が置かれるのは、メモリの書き換え不可能な領域になっています。 (最近のOSではそうなっています。これにより致命的な暴走を防いでいるのです) つまり"Cat, Dog, Tiger, Bug"という文字列自体は、 図書館にある本のようなものです。 書き込みや切り抜きをしてはいけないことになっています。 コード1の場合、zooが指しているのは文字列情報そのものです。 対してコード2の場合、文字列情報を一度配列zoo[]にコピーしています。 「図書館の本の何ページ目」と、 「図書館の本の何ページ目をコピーした紙」の差のようなものです。 関数strtokは、与えられた文字列に\0を挟むことによって、文字列を分解します。 そのため、もともとの文字列は書き換えられてしまいます。 コード1の場合は、図書館の本を切り張りするようなもので、叱られますが、 コード2の場合、コピーした紙を切り張りするので、ご自由にどうぞというわけです。

mk1234
質問者

お礼

回答ありがとうございます。 大変良く分かりました。

関連するQ&A