gpt4 book ai didi

c - 当函数失去作用域时程序中的 APPCRASH (c0000005)

转载 作者:行者123 更新时间:2023-11-30 21:26:29 24 4
gpt4 key购买 nike

当我错误地遗漏了 scanf() 函数的第二个参数时,程序仍然编译并运行,但可执行文件遇到以下错误:“APPPCRASH”,异常代码为“c0000005”(这意味着有一个内存访问冲突据我所知)。我做了一些实验,当调用 scanf() 的函数超出范围时,似乎总是会发生崩溃,但我后来意识到,这种情况在实际调用中发生的次数比不发生的情况要多。示例:

void afunction (void) {
printf("This works fine!");
scanf("%c"); /* NOTE the second parameter omission */
printf("This showed up a few times, misleading me");
}

我现在有三个问题:

1)为什么编译器不会编译代码失败?它甚至没有警告我!

2) scanf() 现在是否尝试写入内存地址 NULL?例如:scanf("%c", NULL)

3) 为什么/如何执行失败的 scanf() 语句下面的内容?

其他信息:
平台:Windows
编译器:GCC
IDE:Code::Blocks

最佳答案

“为什么编译器不会编译代码失败?它甚至没有警告我!”

这是因为 scanf() 的签名是 int scanf ( const char * format, ... ); ... 代表 varargs零参数也是有效的可变参数。看来 gcc 不够智能,无法在编译时解析格式字符串并生成警告。

“scanf()现在尝试写入内存地址NULL吗?例如:scanf("%c", NULL)”

这很可能依赖于实现,但很可能它只是尝试从带有格式字符串的第一个参数所在的堆栈中读取一些数据。

“为什么/如何执行失败的 scanf() 语句下面的任何内容?”

scanf() 解析第一个参数并检测到它需要一个指针时,它会在其中获取一些未初始化的内存随机垃圾,如果你“幸运”,你会得到一个“有效” “地址位于程序内存中的某个位置,它不会立即出现段错误。这确实很不幸,因为(如您所见)有时会失败,有时却不会。这些类型的内存损坏很难追踪,因为错误出现的点可能与错误发生的点没有任何联系。

关于c - 当函数失去作用域时程序中的 APPCRASH (c0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15719591/

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