Я сделал простой тестовый пример:
static void va_test(char* str_arg, ...)
{
va_list ap;
va_start(ap, str_arg);
for( ; ; ) {
if (str_arg == NULL)
break;
int n = va_arg(ap,int);
printf("arg: %s,%d\n", str_arg, n);
str_arg = va_arg(ap,char*);
}
va_end(ap);
printf("\n");
}
Когда я запускаю его с va_test("beer",1,"cofe",2,"juice",3,0)
в автономном исполняемом файле, он работает нормально.Но когда я вызываю его из исполняемого файла моего проекта, который очень большой, он выдает какую-то строку мусора, подобную этой:
arg: bear,1
arg: cofe,2
arg: juice,3
arg: ^X(garbage...),57
Я предполагаю, что перед вызовом этой функции должен быть хаос в памяти, но какЯ его отлаживаю?
[EDIT] Я немного обновил описание, так как, строго говоря, ошибка возникает, когда я передал более 6 аргументов в va_test.Я понял, что первые шесть аргументов по 64 бита передаются по регистру на машине amd64, а остальные аргументы передаются по стеку.Проблема возникает, когда va_arg пытается получить первый аргумент из *overflow_arg_area
.