国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網 會員登陸 & 注冊

二級指針失效的一種原因(scanf函數(shù))

2022-08-04 23:47 作者:鳧水億  | 我要投稿

最近使用 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é)存儲空間,所以勢必會影響到后面的二級指針。

覆蓋數(shù)據(jù)

再次測試,將 %d 改回 %c 然后再進行讀取,發(fā)現(xiàn)二級指針儲存的數(shù)據(jù)回復正常了 !

得出結論,scanf 函數(shù)將讀取到的數(shù)據(jù),按格式化字符串接受的類型,原封不動的以二進制形式存儲到后面對應地址中,此間不會發(fā)生任何隱式轉換!

所以使用 scanf 函數(shù),一定要將格式化字符串與后面接受的地址一一對應。

畫渣up,請不要介意

一一對應


二級指針失效的一種原因(scanf函數(shù))的評論 (共 條)

分享到微博請遵守國家法律
东兰县| 特克斯县| 河北区| 昌图县| 乐都县| 湟中县| 交口县| 密山市| 内乡县| 荔浦县| 仪陇县| 永年县| 祥云县| 名山县| 思南县| 芒康县| 蓬溪县| 灌南县| 通榆县| 临城县| 长丰县| 都昌县| 商城县| 满城县| 辽中县| 义马市| 榆林市| 晋城| 上饶市| 民乐县| 安义县| 天柱县| 翼城县| 宿州市| 饶平县| 中卫市| 乌海市| 双鸭山市| 剑阁县| 阳新县| 沅江市|