アプリ版:「スタンプのみでお礼する」機能のリリースについて

char *p
char *t = "123.456";

p = strtok(t,".");

上記のコードをgcc2.95でコンパイルすると、実行時に
「Bus Error」としてコアダンプしますが、char *tを
char t[]と配列にすると正常に動きます。

この違いは何なのでしょうか?

A 回答 (2件)

strtok()はポインタで指定された文字列にNULL文字を埋め込んでいきます。

ですから、第1引数に文字列定数を指定することは出来ません。
ご参考までに以下のURLをご覧ください。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtok.html
    • good
    • 0
この回答へのお礼

第一引数が変更されるのですね。納得いきました。
確かにマニュアルを見ると

char *
strtok(char *str, const char *sep);

となってますので、constではないところが原因だったと
いうこですね。

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

お礼日時:2005/04/27 03:04

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という訳です。

どうでしょう?
    • good
    • 0
この回答へのお礼

詳細に教えていただいてありがとうございます。

strtok関数自体だけでなく、その周辺のことまで
勉強になりました。

お礼日時:2005/04/27 03:05

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