Я написал функцию с переменным числом C, задача которой - выделить необходимую память для буфера, а затем вывести аргументы этой функции в этом буфере. Но я вижу странное поведение с этим. Это работает только один раз. Если у меня есть два вызова для этой функции, это segfaults.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
char *xsprintf(char * fmt, ...)
{
va_list ap;
char *part;
char *buf;
size_t len = strlen(fmt)+1;
va_start(ap, fmt);
while (part = va_arg(ap, char *))
len += strlen(part);
va_end(ap);
buf = (char*) malloc(sizeof(char)*len);
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
return buf;
}
int main(int argc, const char *argv[])
{
char *b;
b = xsprintf("my favorite fruits are: %s, %s, and %s", "coffee", "C", "oranges");
printf("size de buf is %d\n", strlen(b)); //this works. After it, it segfaults.
/*
free(b);
b = NULL;
*/
b = xsprintf("my favorite fruits are: %s, %s, and %s", "coffee", "C", "oranges");
printf("size de buf is %d\n", strlen(b));
printf("%s", b);
return 0;
}
вот вывод этой программы:
size de buf is 46
[1] 4305 segmentation fault ./xsprintftest
Я что-то не так делаю? Разве я не должен использовать va_start
несколько раз в одной функции? Есть ли у вас альтернативы? Большое спасибо! :)