我想避免内存分配来构造设备的路径
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);
asprintf 动态分配所需的内存,而第一种方法在堆栈上声明(可能)更大的缓冲区。因此 asprintf 使用的字节数与需要的字节数完全相同,而 char buf[MAX] 则没有。但是您必须确保自己释放在 asprintf 中分配的内存
最显着的区别不是内存的几个字节,而是内存来自哪里以及之后需要如何处理它。
buf
在堆栈上分配,如果你从你的代码片段来自的函数返回,那么device
将不再指向有效的内存位置。腐败或崩溃将是最有可能的结果。另一方面,如果你只device
在函数内部使用,你就不必事后释放它。此外,堆栈分配的内存通常更有效,尽管缓存和优化可能等同于图片。asprintf
从堆中分配内存,这意味着只要它运行,您就可以安全地将它传递给程序的所有部分。不利的一面是,free
当您不再需要它时您必须使用它,否则它将永远挂起并且您有内存泄漏(这可能重要与否,取决于有多少未释放的缓冲区浮动)。然后你有责任释放内存。但是要回答您的问题:asprintf
不会分配比需要更多的字节,并且您不必指定可能“感觉”更好的最大大小。不过,您可能不应该担心额外的几个字节的堆栈内存。有多大PATH_MAX
?半千字节?