char * return_buffer()
{
char buffer[1024];
snprintf(buffer, sizeof(buffer), "%s", "test");
return buffer;
}
関数内でバッファが作成されますが、バッファを直接返すことはできますか? 関数が戻った後、バッファは消えますか?
char * return_buffer()
{
char buffer[1024];
snprintf(buffer, sizeof(buffer), "%s", "test");
return buffer;
}
関数内でバッファが作成されますが、バッファを直接返すことはできますか? 関数が戻った後、バッファは消えますか?
静的に割り当てられたバッファーを作成しています。つまり、スタック上に作成されています。関数が戻ると、使用されなくなったスタック上のアドレスが返されます。そのため、より多くの関数呼び出しを行うと、格納されているデータが破損する可能性があります。
malloc を呼び出してヒープに割り当てる方がはるかに優れています。
を使用してヒープにバッファを割り当てる必要がありますmalloc
。
buffer
はローカル/自動変数であり、関数が返された後に存在することは保証されていません。関数のスコープを超えてそのようなバッファを使用すると、未定義の動作が発生します。
はい。このバッファは、スタックを使用するローカル変数であり、関数を終了すると解放されます。動的メモリ バッファを割り当てるには、malloc を使用します。
この場合、できません。できますが、これを行うべきではありません。ここでbuffer
は、再利用されるスタック上に作成されます。
malloc
または同様の関数で割り当てたときに戻ることができます。
これは不可能であり、クラッシュにつながる可能性があります。ここでメモリはスタックに割り当てられ、関数が戻るとメモリは解放されます。関数からバッファを返したい場合は、ヒープにメモリを割り当てる必要があります。これには malloc/calloc を使用できます。続きを読む
いいえ、ローカル変数へのポインターを返すことはできません。
このような関数を作成する最善の方法は、呼び出し元に割り当てを任せることです。利点は次のとおりです。1) コードはメモリ割り当て方法に依存せず、静的に割り当てられたメモリと動的に割り当てられたメモリの両方で使用できます。2) アルゴリズムとメモリ割り当てを分離して、アルゴリズムが目前のメインタスクにのみ関係するようにします。また、メモリ割り当てなど、アルゴリズム自体に関係のない副次的なタスクに関与する必要はありません。
この種のプログラム設計は非常に一般的です (たとえば、Windows API で使用されます)。
例:
void print_buffer (char* buffer, size_t size)
{
snprintf(buffer, size, "%s", "test");
}