почему значение аргумента изменяется во вложенном вызове и приводит к ошибке сегментации - PullRequest
0 голосов
/ 27 октября 2011

У меня есть проект Visual Studio, который я портирую на Android. Я сталкиваюсь с проблемой ошибки сегментации в вызовах функций, которая напоминает функции ниже:

char* format1(const char* fmt, ...) {
    char* buf = new char[1030];
    va_list ap;
    va_start(ap, fmt);
    vsprintf(buf, fmt, ap);
    va_end(ap);
    return buf;
}

char* format2(const char* fmt, ...) {
    va_list ap;
    va_start(ap, fmt);
    char* s = format1(fmt, ap);
    va_end(ap);
    return s;
}

Вызов функций следующий:

char* s = format2("%*.*d", 8, 8, 9910153);

У меня есть пара вопросов относительно вышеупомянутого:

Если я переберу код в gdb для вызова функции 'function2', она покажет: формат (fmt = 0x4) Почему это так?

Когда вызывается 'function1', GDB показывает: format1 (fmt = 0x15be30 «какое-то случайное значение в памяти») Почему же значение fmt изменилось? Также, в зависимости от значения в fmt, второй вызов приводит к ошибке сегментации.

Любая помощь в объяснении вышеупомянутого поведения будет высоко ценится.

1 Ответ

3 голосов
/ 27 октября 2011

format1 принимает переменный набор аргументов, а не va_list; Вы передаете ему один (нецелочисленный) аргумент, и строка формата ожидает три целочисленных аргумента, поэтому возникает неопределенное поведение.

Это должно быть что-то вроде:

char* format1(const char* fmt, va_list ap) {
    char* buf = new char[1030];
    vsprintf(buf, fmt, ap);    
    return buf;
}
...