假设我想编写一个生成字符串的函数,虽然我可以设置字符串的上限大小,但事先不知道字符串会占用多少空间。我可以考虑两种方式来解决这个问题:
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;
}
我所能看到的唯一区别是,第二种形式可能会浪费一些内存:它为
buffer2
使用128字节,该变量在其整个存在期间都会使用这些字节。第一个函数使用128字节来存储buffer1
,加上字符串“actually”实际使用的任何内存,但是当buffer1
从堆栈中移除时,将仅使用实际需要的字符串内存。
如果字符串的寿命很长并且会有大量字符串,那么第一个函数似乎更好。是否有其他原因可以优先选择其中一种形式?(这是一个学术问题;我并不真正处于使用多90字节会有影响的情况下。)
snprintf()
可能不会用\0
终止你的字符串。去读一下手册或者其他资料吧... - user405725snprintf()
总是终止字符串,你可能在想strncpy()
。这是 manpage 中的第二段。 - Davesnprintf
总是会在缓冲区中加入空终止符(除非缓冲区大小为0)。 - Chris Doddmalloc
是标准C函数,比strdup
更具可移植性。 - Mike Kinghan