• ベストアンサー

sprintf の使い方について

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 は文字列の最初の文字のアドレスを表すんだったと思うんですが。 違いが分からず,混乱しています。 初心者につき,間抜けな質問をしているかもしれませんが,ご教授くださると幸いです。

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

  • ベストアンサー
  • DVD-RW
  • ベストアンサー率36% (195/541)
回答No.1

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

k1220011_2005
質問者

お礼

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

その他の回答 (1)

noname#22058
noname#22058
回答No.2

後者が正しく動いているように見えるのは、 「たまたま」です。 sprintfの第1引数に指定する領域は、 結合後の文字列の内容を確保できるだけの 大きさを持っていなければなりません。 後者の場合、どこか大事な領域を破壊しているかもしれません。

k1220011_2005
質問者

お礼

ご回答くださり,ありがとうございます。 > どこか大事な領域を破壊しているかもしれません。 ポインタを使っているときには,もっと思慮深くならないといけないようですね。 大変なことにならないようにも,注意深く,ポインタを使いたいです。 モヤモヤとしていた疑問が解消しました。 ありがとうございました。

関連するQ&A