va_args 解析中的分段错误
为什么下面的代码给出EXC_BAD_ACCESS,无法访问内存
?
int combine_strings(char **outputStr,...)
{
va_list ap;
char *s, *out=0;
int len=0;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len+=strlen(s);
}
va_end(ap);
if(!(out=malloc(len+1)))
exit(1);
*outputStr=out;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len=strlen(s);
memcpy(out,s,len);
out+=len;
}
va_end(ap);
*out=0;
return 0;
}
Why does the code below gives EXC_BAD_ACCESS, could not access memory
?
int combine_strings(char **outputStr,...)
{
va_list ap;
char *s, *out=0;
int len=0;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len+=strlen(s);
}
va_end(ap);
if(!(out=malloc(len+1)))
exit(1);
*outputStr=out;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len=strlen(s);
memcpy(out,s,len);
out+=len;
}
va_end(ap);
*out=0;
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我不得不不同意之前其他海报的观点。原始代码不会对同一个
va_list
进行两次迭代。它创建两个不同的列表并依次迭代每个列表,即使使用相同的变量来保存两个列表也是如此。事实上,我成功地运行了该函数。因此,我的猜测是问题在于函数的调用方式。以下是我的调用方式,请注意尾随的
NULL
和output
参数的设置:上面的代码按预期输出
FOOBARBAZ
。I have to disagree with the other previous posters. The original code does not iterate over the same
va_list
twice. It creates two different ones and iterates over each of them in turn, even though the same variable is used to hold both lists.In fact, I managed to run the function properly. Hence, my guess is that the problem is in how the function was called. Here is how I called it, note the trailing
NULL
and the setup of theoutput
parameter:The code above outputs
FOOBARBAZ
as expected.您不能对同一个
va_list
进行两次迭代。您需要使用va_copy()
创建一个副本。You cannot iterate over the same
va_list
twice. You need to create a copy usingva_copy()
.在一个函数中使用两次 va_start 很难在所有平台上工作。请参阅此处了解更多信息。
可能最好使用 va_copy。
Using va_start twice in one function is difficult to get to work on all platforms. See here for more information.
Probably best to use va_copy.
回答此类问题的简单方法是在调试器中运行它。您将获得完整的堆栈跟踪、代码指针,并且您将能够查看所有变量的值。
要使用gdb,首先使用调试符号(
-g
在海湾合作委员会)。然后,运行它:它会崩溃,您将能够明白原因。
The easy way to answer this kind of question is to run it in a debugger. You'll get a full stack trace, code pointer, and you'll be able to look at the values of all the variables.
To use gdb, first compile the program with debugging symbols (
-g
in gcc). Then, run it:It will crash and you'll be able to see why.