Debian中gcc的奇怪行为
这是有效的解决方案吗? 如果删除未使用的“magic”变量-返回字符串后出现分段错误。 你做错了什么 $gcc—版本 通用条款(Debian 4.4.5-8)4.4.5 $uname-aDebian中gcc的奇怪行为,c,linux,gcc,debian,C,Linux,Gcc,Debian,这是有效的解决方案吗? 如果删除未使用的“magic”变量-返回字符串后出现分段错误。 你做错了什么 $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。这就是你撞车的原因。这是非常不明确的行为。魔法是巧合;这并不能更好地定义行为 最好使用: 或者类似的东
Linux deep station(squeeze)2.6.32-5-686#1 SMP Fri May 10 08:33:48 UTC 2013 i686 GNU/Linux您试图写入未初始化的指针
out
。这就是你撞车的原因。这是非常不明确的行为。魔法是巧合;这并不能更好地定义行为
最好使用:
或者类似的东西
你可以改进这个。例如:
char *out = malloc(256);
...
vsnprintf(out, 256, fmt, items);
...
return out;
确保释放调用代码中分配的内存。与问题无关,但不应该有东西初始化
out
?@guest:与问题无关-问题恰恰是out
没有初始化,所以会发生崩溃。很好的侦查。谢谢>>>请确保在调用代码中释放分配的内存。免费使用()我需要解决方案并发现奇怪的行为对不起,我不理解你的评论。如果您不希望函数分配内存,那么您有两个选择。更好的选择是传入一个缓冲区(char*buffer
)及其长度(size\t buflen
),然后使用它们:vsnprintf(buffer,buflen,fmt,items)
。更糟糕的选择是静态字符缓冲区[256]函数中的代码>和vsnprintf(缓冲区、sizeof(缓冲区)、fmt、项目)代码>。这存在并发性问题,这意味着您不能调用函数两次,并且在没有显式复制的情况下保留两个格式化字符串。这两个可能都有一个太短的缓冲区。感谢您的解决方案!现在,我只对stft()的单个调用使用全局缓冲区,并通过一个调用为当前stft()上下文重新分配缓冲区长度。多谢!
char *str = stft ("%s-%s %s", a, b, c);
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;
}