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

2

asprintf 动态分配所需的内存,而第一种方法在堆栈上声明(可能)更大的缓冲区。因此 asprintf 使用的字节数与需要的字节数完全相同,而 char buf[MAX] 则没有。但是您必须确保自己释放在 asprintf 中分配的内存

于 2013-09-13T07:29:36.547 回答
1

最显着的区别不是内存的几个字节,而是内存来自哪里以及之后需要如何处理它。

  • buf在堆栈上分配,如果你从你的代码片段来自的函数返回,那么device将不再指向有效的内存位置。腐败或崩溃将是最有可能的结果。另一方面,如果你只device在函数内部使用,你就不必事后释放它。此外,堆栈分配的内存通常更有效,尽管缓存和优化可能等同于图片。
  • asprintf从堆中分配内存,这意味着只要它运行,您就可以安全地将它传递给程序的所有部分。不利的一面是,free当您不再需要它时您必须使用它,否则它将永远挂起并且您有内存泄漏(这可能重要与否,取决于有多少未释放的缓冲区浮动)。然后你有责任释放内存。

但是要回答您的问题:asprintf不会分配比需要更多的字节,并且您不必指定可能“感觉”更好的最大大小。不过,您可能不应该担心额外的几个字节的堆栈内存。有多大PATH_MAX?半千字节?

于 2013-09-13T07:42:35.437 回答