- ベストアンサー
文字列ポインタと配列の違いでバスエラーになる
char *p char *t = "123.456"; p = strtok(t,"."); 上記のコードをgcc2.95でコンパイルすると、実行時に 「Bus Error」としてコアダンプしますが、char *tを char t[]と配列にすると正常に動きます。 この違いは何なのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
strtok()はポインタで指定された文字列にNULL文字を埋め込んでいきます。ですから、第1引数に文字列定数を指定することは出来ません。 ご参考までに以下のURLをご覧ください。
その他の回答 (1)
- du0315
- ベストアンサー率20% (1/5)
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という訳です。 どうでしょう?
お礼
詳細に教えていただいてありがとうございます。 strtok関数自体だけでなく、その周辺のことまで 勉強になりました。
お礼
第一引数が変更されるのですね。納得いきました。 確かにマニュアルを見ると char * strtok(char *str, const char *sep); となってますので、constではないところが原因だったと いうこですね。 ご回答ありがとうございました。