如何解决错误消息:C:\WINDOWS\SysWOW64\msvcrt.dll
how to address error message re: C:\WINDOWS\SysWOW64\msvcrt.dll
我是 运行 一个用 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 link,并用 "sfc /scannow" 命令扫描了我的机器,扫描结果没有问题。我唯一没有做的就是重新安装这个文件。我能做些什么来解决这个问题吗?
因为s[3]
不是字符串,而是单个字符。 printf
函数认为单个字符(很可能是单个字节)是指向以零结尾的字符序列的指针,但事实并非如此,您将有 未定义的行为.
要打印单个字符,您应该使用 "%c"
格式。有关详细信息和所有格式的 table,请参阅 this printf
(and family) reference。
错误在您的代码中。 msvcrt.dll
(为您提供函数 printf
的库)只是崩溃了,因为您输入了错误的参数并尝试使用它们,它被咬了,现在看起来像 it 是罪魁祸首 - 但实际上是你。这就像给你朋友提供警察 phone 号码并告诉他这是披萨服务,他应该在那里订一些披萨,然后警察让他为所谓的 "prank call" 支付罚款。在这种情况下罚款是崩溃。
问题出在这里:
printf ("\n%s", s[3]);
%s
需要一个 字符串指针 作为参数。你给它喂了一个字符。字符串中的第 4 个字符是 w
,它的 ASCII 代码为 119
或 0x77
十六进制,printf
会认为这是一个内存地址,因此它现在会尝试从内存地址读取 0x00000077
无法工作并使其崩溃!
你需要的是 %c
它将打印一个字符(按值):
printf ("\n%c", s[3]);
我所说的 "by value" 是什么意思:您仍然传递完全相同的值,119
。只是您现在告诉 printf
将其视为字符的 ASCII 值 (%c
),它将被正确解释为 w
字符,而不是指向字符串 (%s
).
我是 运行 一个用 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 link,并用 "sfc /scannow" 命令扫描了我的机器,扫描结果没有问题。我唯一没有做的就是重新安装这个文件。我能做些什么来解决这个问题吗?
因为s[3]
不是字符串,而是单个字符。 printf
函数认为单个字符(很可能是单个字节)是指向以零结尾的字符序列的指针,但事实并非如此,您将有 未定义的行为.
要打印单个字符,您应该使用 "%c"
格式。有关详细信息和所有格式的 table,请参阅 this printf
(and family) reference。
错误在您的代码中。 msvcrt.dll
(为您提供函数 printf
的库)只是崩溃了,因为您输入了错误的参数并尝试使用它们,它被咬了,现在看起来像 it 是罪魁祸首 - 但实际上是你。这就像给你朋友提供警察 phone 号码并告诉他这是披萨服务,他应该在那里订一些披萨,然后警察让他为所谓的 "prank call" 支付罚款。在这种情况下罚款是崩溃。
问题出在这里:
printf ("\n%s", s[3]);
%s
需要一个 字符串指针 作为参数。你给它喂了一个字符。字符串中的第 4 个字符是 w
,它的 ASCII 代码为 119
或 0x77
十六进制,printf
会认为这是一个内存地址,因此它现在会尝试从内存地址读取 0x00000077
无法工作并使其崩溃!
你需要的是 %c
它将打印一个字符(按值):
printf ("\n%c", s[3]);
我所说的 "by value" 是什么意思:您仍然传递完全相同的值,119
。只是您现在告诉 printf
将其视为字符的 ASCII 值 (%c
),它将被正确解释为 w
字符,而不是指向字符串 (%s
).