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