プロが教える店舗&オフィスのセキュリティ対策術

ポインタ関係について勉強を始めたら、分からないことが沢山出てきて質問ばかりですが、よろしくお願いします。

strtokを使う時コード1はエラーが出ますがコード2は出ません。

どうしてなのでしょうか?

char *zoo = "Cat, Dog, Tiger, Bug"; ←コード1
char zoo[] = "Cat, Dog, Tiger, Bug"; ←コード2

strtok(zoo, " ,");

A 回答 (1件)

strtokは、与えられた文字列に変化を加えますが、


コード1の場合は元の文字列が書き換え不可な領域に存在します。
コード2の場合、書き換え可能な領域にコピーされているので、エラーは出ません。

コンパイルした実行可能プログラム(Windowsなら.exeファイル)の中には、
どこかに"Cat, Dog, Tiger, Bug"という文字列情報が入っています。
コンピュータは、ディスク上にある実行可能プログラムを
メモリ上にコピーしてから実行します。
通常、文字列情報が置かれるのは、メモリの書き換え不可能な領域になっています。
(最近のOSではそうなっています。これにより致命的な暴走を防いでいるのです)

つまり"Cat, Dog, Tiger, Bug"という文字列自体は、
図書館にある本のようなものです。
書き込みや切り抜きをしてはいけないことになっています。

コード1の場合、zooが指しているのは文字列情報そのものです。
対してコード2の場合、文字列情報を一度配列zoo[]にコピーしています。
「図書館の本の何ページ目」と、
「図書館の本の何ページ目をコピーした紙」の差のようなものです。

関数strtokは、与えられた文字列に\0を挟むことによって、文字列を分解します。
そのため、もともとの文字列は書き換えられてしまいます。
コード1の場合は、図書館の本を切り張りするようなもので、叱られますが、
コード2の場合、コピーした紙を切り張りするので、ご自由にどうぞというわけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

大変良く分かりました。

お礼日時:2004/01/05 13:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!