最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

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

二級指針失效的一種原因(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ù))的評論 (共 條)

分享到微博請遵守國家法律
定襄县| 沁源县| 德江县| 沈丘县| 桂平市| 札达县| 天台县| 万山特区| 扬州市| 桂阳县| 梅州市| 府谷县| 泗洪县| 郁南县| 会昌县| 彭山县| 日照市| 岚皋县| 湄潭县| 沂源县| 乌兰察布市| 玉溪市| 丽江市| 甘泉县| 岫岩| 桐梓县| 芜湖市| 宁化县| 兴义市| 定结县| 沈阳市| 伽师县| 澄江县| 远安县| 普安县| 多伦县| 佛坪县| 田阳县| 英德市| 林芝县| 罗城|