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 は文字列の最初の文字のアドレスを表すんだったと思うんですが。
違いが分からず,混乱しています。
初心者につき,間抜けな質問をしているかもしれませんが,ご教授くださると幸いです。
No.2
- 回答日時:
後者が正しく動いているように見えるのは、
「たまたま」です。
sprintfの第1引数に指定する領域は、
結合後の文字列の内容を確保できるだけの
大きさを持っていなければなりません。
後者の場合、どこか大事な領域を破壊しているかもしれません。
ご回答くださり,ありがとうございます。
> どこか大事な領域を破壊しているかもしれません。
ポインタを使っているときには,もっと思慮深くならないといけないようですね。
大変なことにならないようにも,注意深く,ポインタを使いたいです。
モヤモヤとしていた疑問が解消しました。
ありがとうございました。
No.1ベストアンサー
- 回答日時:
C言語はかなりご無沙汰の経験者です。
用語とかも記憶の隅っこです。char str[40];
こちらはstrに40byte分の静的な記憶領域が確保されています。
char *str;
こちらはstrと言う名前のポインター変数を用意しただけで、実際の領域が与えられていません。
sprintf(str, "hogehoge %d", hoge_int);
とする前に、strに確保された領域のアドレスを渡してあげなければいけません。(malloc関数?で動的な記憶領域を確保したり、ほかの静的な記憶領域のアドレスをポインターに渡します。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 少しの疑問 4 2022/11/08 02:48
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# 略語の読み方について 2 2023/05/25 12:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
ヒープ領域の限界値設定
-
malloc呼び出し時のセグメンテ...
-
allocってなんですか?
-
void*型のデータサイズ
-
文字列ポインタとgets関数の関...
-
スタック破壊の上手な見つけ方...
-
プログラムが途中で強制終了し...
-
【VC++6.0(MFC)】メモリの静的...
-
グローバル変数のサイズ
-
new、memset()、エラー
-
Accessで、メモリを開放するタ...
-
配列の添え字の最大数とは?
-
UNIX socket TCP 受信バッファ...
-
ヒープメモリの解放について
-
reallocの断片化対策について
-
mallocについて
-
DLLのマルチスレッドの動作につ...
-
指定したメモリアドレスの値の...
-
座標値を読み込んである領域に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ヒープ領域の限界値設定
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
入れ子になった構造体について
-
64ビットと32ビットの違い
-
free関数で動作が止まる
おすすめ情報