为什么参数值在嵌套调用中发生变化并导致分段错误

时间:2011-10-27 16:06:22

标签: c++ visual-studio segmentation-fault android-ndk porting

我有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 个答案:

答案 0 :(得分:3)

format1采用可变参数集,而不是va_list;你传递一个(非整数)参数,格式字符串需要三个整数参数,因此会产生未定义的行为。

应该是这样的:

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