二級指針失效的一種原因(scanf函數(shù))
最近使用 C 語言寫一個學生管理系統(tǒng),突發(fā)奇想,想使用二級指針接收判斷后的結果,函數(shù)實現(xiàn)已經寫好了,可經過幾輪測試發(fā)現(xiàn)二級指針變量總是變成 0 ,以下是代碼片段:
以下是用于接收判斷的數(shù)據(jù)是否合理的一些變量,其中第三行是二級指針。
scanf 函數(shù),讀取數(shù)據(jù)至臨時學生結構體,有些數(shù)據(jù)需要單獨處理,但細心的大佬就會發(fā)現(xiàn),年齡使用了 %d &tempage 對,乍一看是將讀取的整形,隱式轉換為 char 型,節(jié)約儲存空間,但其中暗藏殺機。
接下來就是函數(shù)?void judgeDataForCorrect(STUDENT student,char ** result);?用于判斷輸入的數(shù)據(jù)是否合理,例:當分數(shù)在 0 至 150之外時,賦值為 'n' ,否則為 'y',其他判斷亦是如此,STUDENT student??是被驗證的數(shù)據(jù),char ** result?用于接收被驗證的數(shù)據(jù)是否合理的結果,形如?'yynyynn'。
當運行程序后,程序崩潰了,沒有一點提示。經過排查,發(fā)現(xiàn)二級指針的地址位于?char tempage=0; 之上,且他們之間的地址,只相隔了一個字節(jié)。

是不是 char tempage 數(shù)據(jù)影響了二級指針的數(shù)據(jù)呢?
將原有的 scanf 函數(shù)
改為:
輸入 "韓梅梅 34" 回車,進行測試發(fā)現(xiàn)讀取的 tempage 為 3?,二級指針存儲的數(shù)據(jù)也正確,然后再將 %c 改為 %d 進行測試發(fā)現(xiàn),此時 tempage 居然是 " ,但二級指針儲存的數(shù)據(jù)變?yōu)榱?0 。
由此可以推測,scanf("%d",&charAge); 并不會如我們所想的將讀取到的數(shù)字隱式的轉換為 char(數(shù)字[34]->字符34["])?,而是將讀取到的數(shù)字以二進制形式存儲到了 char 類型變量中,占據(jù)了自 char 類型變量起,往后4個字節(jié),因為 char 類型數(shù)據(jù)只有 1 字節(jié)存儲空間,所以勢必會影響到后面的二級指針。

再次測試,將 %d 改回 %c 然后再進行讀取,發(fā)現(xiàn)二級指針儲存的數(shù)據(jù)回復正常了 !
得出結論,scanf 函數(shù)將讀取到的數(shù)據(jù),按格式化字符串接受的類型,原封不動的以二進制形式存儲到后面對應地址中,此間不會發(fā)生任何隱式轉換!
所以使用 scanf 函數(shù),一定要將格式化字符串與后面接受的地址一一對應。
畫渣up,請不要介意
