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

C 言語の超初心者につき,おろかな質問をお許しください。

sprintf 関数について

char str[40];
sprintf(str, "hogehoge %d", hoge_int);

という文法はよく目にするのですが

char *str;
sprintf(str, "hogehoge %d", hoge_int);

という文法はあまり見たことがありません。

両方ともちゃんと動くのですが,後者は文法的に正しいのでしょうか?

char str[40] とした場合でも char *str とした場合でも,
str は文字列の最初の文字のアドレスを表すんだったと思うんですが。

違いが分からず,混乱しています。

初心者につき,間抜けな質問をしているかもしれませんが,ご教授くださると幸いです。

A 回答 (2件)

後者が正しく動いているように見えるのは、


「たまたま」です。
sprintfの第1引数に指定する領域は、
結合後の文字列の内容を確保できるだけの
大きさを持っていなければなりません。
後者の場合、どこか大事な領域を破壊しているかもしれません。
    • good
    • 0
この回答へのお礼

ご回答くださり,ありがとうございます。

> どこか大事な領域を破壊しているかもしれません。

ポインタを使っているときには,もっと思慮深くならないといけないようですね。
大変なことにならないようにも,注意深く,ポインタを使いたいです。

モヤモヤとしていた疑問が解消しました。

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

お礼日時:2006/12/15 11:55

C言語はかなりご無沙汰の経験者です。

用語とかも記憶の隅っこです。

char str[40];
こちらはstrに40byte分の静的な記憶領域が確保されています。
char *str;
こちらはstrと言う名前のポインター変数を用意しただけで、実際の領域が与えられていません。
sprintf(str, "hogehoge %d", hoge_int);
とする前に、strに確保された領域のアドレスを渡してあげなければいけません。(malloc関数?で動的な記憶領域を確保したり、ほかの静的な記憶領域のアドレスをポインターに渡します。)
    • good
    • 1
この回答へのお礼

ご回答くださり,ありがとうございます。

お礼日時:2006/12/15 11:54

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