• ベストアンサー

文字列ポインタと配列の違いでバスエラーになる

char *p char *t = "123.456"; p = strtok(t,"."); 上記のコードをgcc2.95でコンパイルすると、実行時に 「Bus Error」としてコアダンプしますが、char *tを char t[]と配列にすると正常に動きます。 この違いは何なのでしょうか?

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

  • ベストアンサー
回答No.1

strtok()はポインタで指定された文字列にNULL文字を埋め込んでいきます。ですから、第1引数に文字列定数を指定することは出来ません。 ご参考までに以下のURLをご覧ください。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
angband
質問者

お礼

第一引数が変更されるのですね。納得いきました。 確かにマニュアルを見ると char * strtok(char *str, const char *sep); となってますので、constではないところが原因だったと いうこですね。 ご回答ありがとうございました。

その他の回答 (1)

  • du0315
  • ベストアンサー率20% (1/5)
回答No.2

char *t = "123.456"; の意味は、 ・ポインタ変数「t」を使えるようにする。 ・ポインタ「t」は、「書き換え不可能領域に用意される文字列"123.456"のアドレス」を指すように初期化される ということです。ちなみにこの書き換え不可能領域に用意される文字列を文字列リテラルといいます。strtok()は、引数のポインタの先にある領域を書き換える凶悪な関数で、この場合文字列リテラルを書き換えようとして、エラーになっています。ちなみに処理系によっては、エラーにならない場合もあります。 一方、 char t[] = "123.456"; の意味は、 ・ char t[] = {'1', '2', '3', '.', '4', '5', '6', '\0'}; ということで、つまり、要素数8の配列tを用意し、 それを初期化しているワケです。なので、悪名高きstrtok()を使っても、この配列tの内容が書き換わるだけなので、全然OKという訳です。 どうでしょう?

angband
質問者

お礼

詳細に教えていただいてありがとうございます。 strtok関数自体だけでなく、その周辺のことまで 勉強になりました。

関連するQ&A