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

时间:2016-05-13 14:11:51

标签: c windows mingw

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

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”命令扫描我的机器,扫描回来时没有任何问题。我唯一没做的就是重新安装这个文件。我有什么办法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

因为s[3]不是字符串,所以它是一个字符。 printf函数认为单个字符(很可能是单个字节)是指向零终止字符序列的指针,它不是,并且您将具有未定义的行为

要打印单个字符,您应该使用"%c"格式。有关详细信息和所有格式的表格,请参阅this printf (and family) reference

答案 1 :(得分:1)

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

问题在于:

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

%s需要字符串指针作为参数。你正在给它一个字符。字符串中的第4个字符是w,其中包含十六进制的ASCII代码1190x77,而printf会认为这是一个内存地址,所以它现在会尝试从内存地址0x00000077读取无法正常工作并使其崩溃!

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

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

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