0

デバイスのパスを構築するためにメモリ割り当てを回避したい

    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);
4

2 に答える 2

1

最も重要な違いは、メモリの数バイトではなく、メモリがどこから来て、後でどのように処理する必要があるかです。

  • bufスタックに割り当てられ、スニペットの元の関数から戻るとdevice、有効なメモリ位置を指しなくなります。破損またはクラッシュが最も可能性の高い結果になります。一方、device関数内でのみ使用する場合は、後で解放する必要はありません。また、キャッシングと最適化は絵に等しいかもしれませんが、スタックに割り当てられたメモリは一般的により効率的です。
  • asprintfヒープからメモリを割り当てます。つまり、プログラムが実行されている限り、プログラムのすべての部分にメモリを安全に渡すことができます。欠点は、freeもう必要がない場合、または永久にハングアップし、メモリリークが発生する場合に必要になることです (解放されていないバッファがいくつ浮遊しているかに応じて、問題になる場合とそうでない場合があります)。その場合、メモリを解放するのはあなたの責任です。

しかし、あなたの質問に答えるにasprintfは、必要以上のバイトを割り当てることはありません。また、「感じられる」最大サイズを指定する必要はありません。ただし、数バイトの余分なスタック メモリについて心配する必要はないでしょう。の大きさはPATH_MAX?半キロバイト?

于 2013-09-13T07:42:35.437 に答える