va_args解析中的分段错误

RDX*_*RDX 2 c malloc variadic-functions segmentation-fault

为什么下面的代码给出了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;
}
Run Code Online (Sandbox Code Playgroud)

Lin*_*cer 8

我不同意以前的其他海报.原始代码不会迭代va_list两次.它创建两个不同的并依次迭代它们中的每一个,即使使用相同的变量来保存两个列表.

事实上,我设法正确运行该功能.因此,我的猜测是问题在于如何调用函数.这是我如何调用它,请注意参数的尾随NULL和设置output:

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

// ... combine_strings() goes here...
int main()
{
  char * res;
  char * * output = &res;
  combine_strings(output, "FOO", "BAR", "BAZ", NULL);
  printf("%s\n", *output);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码FOOBARBAZ按预期输出.