c - 如何解决错误消息 re : C:\WINDOWS\SysWOW64\msvcrt. dll

标签 c windows mingw

我正在运行一个用 MinGw 编译的非常简单的可执行文件,Windows 10 给我一个错误,指出程序已停止。这是调试 session :

For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from c:\Users\sansari\Documents\source\chapt11\Aa.exe...done.
(gdb) b 2
Breakpoint 1 at 0x40141e: file Aa.c, line 2.
(gdb) run
Starting program: c:\Users\sansari\Documents\source\chapt11/Aa.exe
[New Thread 8756.0x2c54]
[New Thread 8756.0x15d8]

Breakpoint 1, main () at Aa.c:4
4         char s[] = "Aw what the heck";
(gdb) n
5         printf ("\n%s", s);
(gdb) n

Aw what the heck6         printf ("\n%s", s[3]);
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x74cfb180 in ungetwc () from C:\WINDOWS\SysWOW64\msvcrt.dll
(gdb)

我不知道如何解决这个问题或要调查什么。我在线搜索了错误并找到了 this错误,但这是从 2013 年开始的,到现在为止,我确信该补丁已包含在内。无论如何,我确实向小组发送了一封电子邮件。

我还找到了this链接,并使用“sfc/scannow”命令扫描我的机器,扫描结果没有问题。我唯一没有做的就是重新安装这个文件。我能做些什么来解决这个问题吗?

最佳答案

错误在您的代码中。 msvcrt.dll(为您提供函数 printf 的库)崩溃只是因为您输入了错误的参数并尝试使用它们,它被咬了,现在看起来像 是罪魁祸首 - 但实际上是你。这就像给你的 friend 提供警察的电话号码并告诉他这是披萨服务,他应该在那里订一些披萨,然后警察让他为所谓的“恶作剧电话”支付罚款。在这种情况下,罚款是崩溃。

问题出在这里:

printf ("\n%s", s[3]);

%s 需要一个字符串指针 作为参数。您正在为它提供一个角色。字符串中的第 4 个字符是 w,它的 ASCII 代码为 119 或十六进制的 0x77,而 printf 将相信这是一个内存地址,所以它现在将尝试从内存地址 0x00000077 读取,这无法工作并使其崩溃!

您需要的是 %c,它将打印单个字符(按值):

printf ("\n%c", s[3]);

我所说的“按值”是什么意思:您仍然传递完全相同的值 119。只是您现在告诉 printf 将其视为字符的 ASCII 值 (%c),它将被正确解释为 w 字符,而不是指向字符串的内存地址 (%s)。

关于c - 如何解决错误消息 re : C:\WINDOWS\SysWOW64\msvcrt. dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37212265/

相关文章:

c++ - win32::WaitForSingleObject 期间 Windows 上的 Boost.Thread 断言/崩溃

windows - 在 Windows 上使用 Azure CLI 颁发证书链中的自签名证书

mingw 中 UTF-8 的 C++ ctype 面

gcc - mingw 交叉编译错误 - 未定义对 `__mingw_get_msvcrt_handle' 的引用

c - 从文件读取时出现段错误

c - 键盘中断处理程序在系统 iso 中不起作用

C变量 "forgets"接受输入后的值是多少

c - fseek 和 fwrite 过去的 EOF

c++ - 如何限制进程可用的内存?

windows - Hello World 没有输出 - Qt SDK 2010 - Mingw (gcc 4.6.3) - WindowsXP