2016-05-13 122 views
0

我正在运行一个非常简单的可执行文件与MinGw编译,和Windows 10给我一个错误,指出该程序停止。这里是调试会话:如何解决错误消息重新:C: WINDOWS SysWOW64 msvcrt.dll

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”命令扫描了我的机器,并且扫描没有问题返回。我没有做的唯一的事情就是重新安装这个文件。有什么我可以解决这个问题吗?

+0

我想你想'printf(“\ n%s”,s + 3);'。另外,请采用'* n'结尾*'printf's的习惯,而不是启动它们,因为它会刷新stdout。 –

回答

1

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

问题就出在这里:

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

%s期望一个字符串的指针作为参数。你正在喂它一个字符。字符串中的第4个字符是w,它的十六进制代码是1190x77printf会认为这是一个内存地址,因此它现在会尝试从内存地址0x00000077中读取,这将无法正常工作并使其崩溃!

你需要的是%c将打印单个字符(按价值计算):

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

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

1

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

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

相关问题