gpt4 book ai didi

c - 调用 vprintf() 时的 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-11-30 19:11:06 25 4
gpt4 key购买 nike

这段代码有什么问题?

#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不同,它至少打印垃圾,我在调用 vprintf 时得到 EXC_BAD_ACCESS如下所示:

enter image description here

有什么办法可以让我完成这项工作吗?谢谢!

更新:我知道,通过调用带有错误数量的参数的函数,我会得到未定义的行为,但我想要 myprintf表现得像 printf确实(没有崩溃)。那可能吗?有什么方法可以在调用 vprintf 之前检查参数避免异常?

更新2:我想我现在明白了,感谢所有的评论和回答。对于这个非常简单的示例,我认为最好使用宏,它快速失败并在调用点崩溃:

enter image description here

最佳答案

未定义表示不可预测。在一次运行中,printf 可能会产生垃圾,在另一次运行中,它可能会产生 EXC_BAD_ACCESS。您无法重现未定义的行为。在这种特殊情况下,格式化字符串中的 %s 术语表示 printf 需要查找 C 字符串。根据您的 libc 实现,当您没有指定第二个参数时,它可能会在某个地方找到它。如果碰巧在离该指针不远的地方发现了空字符,您将得到垃圾输出。如果没有,printf 将继续搜索字符串的末尾,直到它超出分配给程序的内存范围,并且您获得 EXC_BAD_ACCESS

关于c - 调用 vprintf() 时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40689616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com