我有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中的值,第二个调用会导致分段错误。
非常感谢您解释上述行为的任何帮助。
答案 0 :(得分:3)
format1
采用可变参数集,而不是va_list
;你传递一个(非整数)参数,格式字符串需要三个整数参数,因此会产生未定义的行为。
应该是这样的:
char* format1(const char* fmt, va_list ap) {
char* buf = new char[1030];
vsprintf(buf, fmt, ap);
return buf;
}