int main()
{
int n = 56;
char buf[10]; //want char* buf instead
sprintf(buf, "%i", n);
printf("%s\n", buf);
return 0;
}
このコードは機能します。私の質問は、bufをchar *として、同じ動作が必要な場合はどうなるかということです。
書くときの主な違い
char* buf;
初期化されておらず、メモリが割り当てられていないため、自分で注意する必要があります。
char* buf = malloc(10 * sizeof(char));
// ... more code here
free(buf); // don't forget this or you'll get a memory leak
これは(静的割り当てではなく)動的メモリ割り当てと呼ばれ、呼び出しで変数を使用または使用して、実行時に割り当てられたメモリの量を変更するなどの優れた機能を提供します。また、メモリの量が多すぎると、メモリの割り当てが失敗する可能性があることに注意してください。この場合、返されるポインタはになります。realloc
malloc
NULL
技術的には、 sizeof(char)
1は常に1バイトのサイズになるため、上記は必要ありませんがchar
、他のほとんどのデータ型はより大きく、乗算が重要ですmalloc(100)
-100バイトをmalloc(100 * sizeof(int))
割り当て、100秒間に必要なメモリ量を割り当てますint
。通常、32では400バイトです。 -ビットシステムですが、異なる場合があります。
int amount = calculate_my_memory_needs_function();
int* buf = malloc(amount * sizeof(int));
if (buf == NULL) {
// oops!
}
// ...
if (more_memory_needed_suddenly) {
amount *= 2; // we just double it
buf = realloc(buf, amount * sizeof(int));
if (!buf) { // Another way to check for NULL
// oops again!
}
}
// ...
free(buf);
もう1つの便利な関数はcalloc
、2つのパラメーター(最初:割り当てる要素の数、2番目:バイト単位の要素のサイズ)を取り、メモリを0に初期化することです。
私はcalloc(またはcallocがない場合はmalloc)があなたが求めているものだと思います。
buf
スタックに静的に割り当てられた配列です。タイプchar *
にするには、メモリを動的に割り当てる必要があります。私はあなたが欲しいものはこのようなものだと思います:
int main()
{
int n = 56;
char * buf = NULL;
buf = malloc(10 * sizeof(char));
sprintf(buf, "%i", n);
printf("%s\n", buf);
// don't forget to free the allocated memory
free(buf);
return 0;
}
編集:コメントで「ThomasPadron-McCarthy」が指摘しているように、のリターンをキャストしないでくださいmalloc()
。詳細については、こちらをご覧ください。sizeof(char)
いつものように、を完全に削除することもできます1
。