char * stft (const char *fmt, ...) {
va_list items;
char *out;
int magic = 0; // <-- here magic?
va_start (items, fmt);
vsprintf (out, fmt, items);
va_end (items);
return out;
}
像这样使用:
char *str = stft ("%s-%s %s", a, b, c);
这是可行的解决方案吗? 如果删除未使用的“魔术”变量 - 返回字符串后出现段错误。 做错了什么?
$ gcc --版本 gcc (Debian 4.4.5-8) 4.4.5
$ uname -a Linux deep-station (squeeze) 2.6.32-5-686 #1 SMP Fri May 10 08:33:48 UTC 2013 i686 GNU/Linux
最佳答案
您正在尝试写入未初始化的指针 out
。这就是你崩溃的原因。这是严重未定义的行为。魔法是巧合;它不会使行为得到更好的定义。
可能最好使用 vsnprintf()
:
char *out = malloc(256);
...
vsnprintf(out, 256, fmt, items);
...
return out;
或类似的东西。
您可以改进这一点。例如:
char *stft(const char *fmt, ...)
{
va_list items;
va_start(items, fmt);
int length = vsnprintf(0, 0, fmt, items);
va_end(items);
char *out = malloc(length+1);
if (out != 0)
{
va_start(items, fmt);
vsnprintf(out, length+1, fmt, items);
va_end(items);
}
return out;
}
确保在调用代码中释放分配的内存。
关于c - Debian 中 gcc 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207587/