这段代码有什么问题?EXC_BAD_ACCESS当调用vprintf()
#include <stdio.h>
#include <stdarg.h>
void myprintf(const char * format, ...) __printflike(1, 2);
int main(int argc, const char * argv[]) {
printf("%s\n");
myprintf("%s\n");
return 0;
}
void myprintf(const char * format, ...) {
if (format) {
va_list arguments;
va_start(arguments, format);
vprintf(format, arguments);
va_end(arguments);
}
}
通过使用__printflike
我得到一个不错的警告,就像printf
。但不同于printf
,其中至少打印垃圾,我得到EXC_BAD_ACCESS在调用vprintf
如下所示:
有没有什么办法可以使这项工作? 谢谢!
更新:我的理解是通过调用数错误的参数的函数得到了一个未定义的行为,但我想myprintf
表现就像printf
做(没有崩溃)。那可能吗?在拨打vprintf
以避免异常之前,有什么方法可以检查参数吗?
UPDATE 2:我想我现在明白了,感谢所有的评论和回答。对于这个非常简单的例子,我认为是更好地使用宏,这向主叫点未能快速和崩溃:
“printf,它至少打印垃圾”。这不是保证的行为。当您故意将代码中的错误添加到具有未定义行为的代码中时,您无法期望它“至少打印垃圾”。 UB意味着行为是不可预测的。它可以立即崩溃,它可以后来崩溃,它可以打印垃圾,它可以打印什么,... – kaylum
[是否“未定义行为”真的允许*发生任何事情?](http://stackoverflow.com/questions/ 32132574/does-undefined-behavior-really-permit-anything-to-happen) – kaylum
@kaylum我更新了我的问题,因为我想知道是否有一种方法可以让我的函数的行为像'printf',在它的未定义的方式。从你的角度来看...如果调用者传递错误的参数就足够了,那么记录该行为是不确定的?谢谢! – cromandini