Приветствую. Потребовалась функция на Си, которая создает форматную строку нужной длины. Первоначальный вариант без проблем компилировался и работал на винде через связку msys+mingw-w64
typedef struct cl_String_s{
char *str;
size_t length;
} cl_String;
cl_String *StringCreateF(const char *format, ...){
va_list argptr;
cl_String *result = malloc(sizeof(cl_String));
va_start(argptr, format);
int res = vsnprintf(NULL, 0, format, argptr);
if(res<0){
perror("StringCreateF ERROR");
errno = 0;
free(result);
return NULL;
}
result->length = res;
result->str = malloc(result->length + 1);
vsnprintf(result->str, result->length + 1, format, argptr);
va_end(argptr);
return result;
}
А вот после компиляции в Linux он сегфолтится на втором vsnprintf. Работает нормально только если заново инициировать argptr.
...
va_end(argptr);
va_start(argptr, format);
vsnprintf(result->str, result->length + 1, format, argptr);
va_end(argptr);
return result;
}
В чем может быть причина?