2016-05-13 124 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

相關問題