デバイスのパスを構築するためにメモリ割り当てを回避したい
char *device;
const char *p;
char buf[PATH_MAX];
ウィッチメソッドはメモリレス使用
PATH_MAX
snprintf(buf, sizeof(buf) - 1, "/dev/%s", p);
device = &buf[0];
また
asprintf
asprintf(&device, "/dev/%s", p);
最も重要な違いは、メモリの数バイトではなく、メモリがどこから来て、後でどのように処理する必要があるかです。
buf
スタックに割り当てられ、スニペットの元の関数から戻るとdevice
、有効なメモリ位置を指しなくなります。破損またはクラッシュが最も可能性の高い結果になります。一方、device
関数内でのみ使用する場合は、後で解放する必要はありません。また、キャッシングと最適化は絵に等しいかもしれませんが、スタックに割り当てられたメモリは一般的により効率的です。asprintf
ヒープからメモリを割り当てます。つまり、プログラムが実行されている限り、プログラムのすべての部分にメモリを安全に渡すことができます。欠点は、free
もう必要がない場合、または永久にハングアップし、メモリリークが発生する場合に必要になることです (解放されていないバッファがいくつ浮遊しているかに応じて、問題になる場合とそうでない場合があります)。その場合、メモリを解放するのはあなたの責任です。しかし、あなたの質問に答えるにasprintf
は、必要以上のバイトを割り当てることはありません。また、「感じられる」最大サイズを指定する必要はありません。ただし、数バイトの余分なスタック メモリについて心配する必要はないでしょう。の大きさはPATH_MAX
?半キロバイト?