假设我想编写一个生成字符串的函数,虽然我可以设置字符串大小的上限,但我事先并不知道字符串将占用多少空间。我可以想到两种安排方式:
char *ParametersAsString_1(int temperature, float pressure)
{
char buffer1[128];
snprintf(buffer1, 128, "temperature: %d; pressure: %g",
temperature, pressure);
return strdup(buffer1);
}
char *ParametersAsString_2(int temperature, float pressure)
{
char *buffer2 = malloc(128);
snprintf(buffer2, 128, "temperature: %d; pressure: %g",
temperature, pressure);
return buffer2;
}
我能看到的唯一区别是第二种形式可能会浪费一点内存:它使用 128 个字节来buffer2
保证该变量的整个存在。第一个函数使用 128 字节buffer1
加上字符串“实际”使用的内存,但是当buffer1
从堆栈中删除时,唯一使用的内存就是字符串实际需要的内存。
如果字符串是长寿命的并且会有一堆字符串,那么第一个函数看起来会更好。是否有任何其他理由更喜欢其中一种形式而不是另一种?(这是一个学术问题;我实际上并不处于使用额外的 90 个字节会产生影响的情况。)