談C中scanf陷阱

2021-05-04 16:49:56 字數 586 閱讀 1677

最近一直在看andrew koening寫的書籍,可以說學習c/c++或者從事這方面的開發的人員非常值得一看的書籍,這裡我推薦看看《c陷阱與缺陷》與《c/c++沉思錄》。

這裡先來看看《c陷阱與缺陷》一段**。

這麼精小的一段**,看看執行結果將會是什麼?請看清楚c是字元變數。

剛開始的時候,對他講的東西不是很明白,為了更加清楚,分析相關記憶體結構。

由於scanf指向的是乙個整形指標,此時c接收字元錄入,所以在給c輸入資料的資料的時候,會將i的一些記憶體位址進行覆蓋,怎麼覆蓋的呢?在fc6下,會將i的低端位址覆蓋成c的高階位址,不知道這麼說能不能明白?就是說c實際接收了乙個整形變數,但是c存不下,多出的那部分怎麼辦呢?就將c的高階位址位覆蓋成i的低端位址位了,所以i的值一直都是0,所以在執行此程式是乙個死迴圈狀態。

上面注釋掉那兩段,可以列印看看c與i的位址。我這裡列印的位址是連續的。

但是在vc6中,是可以正常執行的,這就是我說的記憶體位址覆蓋方式不一樣,換句話說,怎麼覆蓋是有編譯器決定,這裡我是這麼猜想,vc覆蓋記憶體的時候是c的左徹的那段記憶體而不覆蓋i的記憶體位址,所以在vc中能正常。

這也是乙個猜想,怠於證實。而在fc中是「往右」進行覆蓋。

scanf的輸入字元時的陷阱

這個例子證明了 scanf c ch 等價於ch getchar 在用 c的時候要格外小心 int型 正確 include int main return 0 char型 錯誤 include int main return 0 有空格時的執行結果 a bvar1 97,var2 98 i 0 c ...

c中scanf函式用法

初看scanf時,覺得還是蠻簡單的,但當深入學習後,才發現裡面有很多小細節值得我們去注意。首先,看看scanf的基本格式 scanf 格式化字串 位址表 scanf 函式返回成功賦值的資料項數,出錯時則返回eof。我們輸入的資料大體上可以分為幾個型別 格式化說明符 空白符 空白符包括 空格,製表符,...

c語言scanf陷阱 緩衝區引起的跳過輸入問題

小白在學習c語言的時經常會有不懂的地方,有時候因為乙個小小的問題,或者因為乙個小小的概念沒有理解清楚,都會造成懵逼 無解的情況,然而這樣的情況在程式設計中經常出現,所以不不僅在c語言中,還存在大多數的程式語言中 本文要說的就是關於c緩衝區特性引發scanf 方法的一些奇怪現象 1.本文描述的編譯環境...