五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

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

分享到微博請遵守國家法律
齐齐哈尔市| 漳州市| 云浮市| 民丰县| 西峡县| 聂荣县| 扎兰屯市| 无极县| 云浮市| 甘南县| 兰坪| 梧州市| 饶河县| 左云县| 莱芜市| 汉中市| 稻城县| 贵溪市| 胶州市| 开江县| 太仆寺旗| 周口市| 长泰县| 湖州市| 汕头市| 繁昌县| 齐齐哈尔市| 越西县| 高州市| 右玉县| 旬邑县| 乌恰县| 长丰县| 钟山县| 朝阳区| 花莲市| 巴林左旗| 无极县| 嘉荫县| 岳阳市| 博野县|