c語言scanf裡的變數,後者的格式控制符錯誤會影響前者嗎?

時間 2021-05-29 23:28:17

1樓:w2014

是c把b覆蓋掉了(

也就是說對於0x12345678,在記憶體中是這樣放置的

0x78 0x56 0x34 0x12。

然後,看起來,你的編譯器並沒有太操心對齊的事情…而是直接在棧上建立了這三個變數

c c b b b b a a a a

也就是說,讀進來a和b之後,是這樣的情況

c c 0x07 0x00 0x00 0x00 0x06 0x00 0x00 0x00

然後,我們又讀進來c=8(0x08 0x00 0x00 0x00),並放在&c開頭的四個位元組裡(因為是%d…雖然不保證是四個位元組…我就暫且按照四個位元組來說了…)

於是,現在就成了

0x08 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x00

你看,c變成了8,b變成了0,真奇妙(暴論

當然,請不要試圖利用這種情況…因為這根本就不是任何語法規定的…

除非你能夠確認目標機器的資料模型和編譯器版本等一系列亂七八糟的資訊(

c語言int陣列變數,通過scanf迴圈賦值,輸入3 5,自動執行,所有數值為3,請問為什麼?

悽臨雨 目前除了本答案,其他兩個答案全有錯 關鍵在於 d不接受 遇到.後scanf直接返回0表示讀取失敗,且 留在輸入緩衝區中,下一次迴圈繼續出錯。如何處理?1.用double變數 lf 給scanf。2.保證你的輸入正確,因此程式無需修改 3.先讀取一整行 字串 再從一行裡進一步讀取。includ...

c 如何用scanf讀入string型別的字串

暮無井見鈴 scanf 配合的是字元陣列,硬是要用 scanf 輸入 basic string 的話不是不行。假設最多讀入 100 個字元 std string buf 0 std size t 101 為了避免寫入自動管理的零終止符 std scanf 101s buf 0 or buf.data...

為什麼在C語言中靜態變數的初值是0?

gkmail 未初始化的靜態變數一般是分配在BSS段 程式載入時會對整個BSS段進行清 操作,因此這些靜態變數的初始值是 而臨時變數是分配在堆疊裡的,在進入函式時,並不會對函式使用的堆疊進行初始化操作,因此堆疊內的未初始化的臨時變數值是不確定的 zephyr z 對於變數 靜態和全域性只是作用域不同...