作者allen20937 (旅行者)
看板C_and_CPP
標題[問題] int跟char一起宣告的Bug?
時間Mon Apr 30 23:49:32 2018
其實我不知道要怎麼下標題才好,因為我也不知道問題出在哪邊,我猜可能是記憶體的問
題,可是我第一次遇到這種問題,所以想問看看有沒有人知道,還請不吝回答,謝謝。
程式碼:
// 宣告部分
int Strength = 999;
int Agility = 999;
.
.
.
.
int tmp_Str;
int tmp_Agi;
char answer;
// 運作部分
.
.
.
.
.
tmp_Str = Strength;
tmp_Agi = Agility;
rewind(stdin);
_getch();
.
.
. (省略用printf畫圖的部分)
.
.
printf("1.攻擊 2.技能 3.逃跑(回合數:1 / 5)\n");
printf("tmp_Agi = %d", tmp_Agi);
printf("> ");
scanf("%s", &answer);
if (answer == '1')
{
printf("tmp_Agi = %d", tmp_Agi);
.
.
.
.
}
https://i.imgur.com/r6w9W8g.png (執行的結果圖)
發生的問題是當使用者輸入答案後,本來存在tmp_Agi裡面的數字會產生改變,可是我沒動
過這個變數,用單步執行也找不出問題來。不過如果在answer上面隨便宣告一個無用的int
變數,就可以避免這個問題發生,如下所示:
int tmp_Str;
int tmp_Agi;
int asdf;
char answer;
所以我猜大概是記憶體配置的問題,但實際上我也不太清楚,因為寫程式到現在第一次發
生這問題,所以還請知道答案的人可以告訴我,謝謝。
--
廚廚復廚廚,木蘭中路廚;不聞支援聲,唯見三嘆息;
問女何冥門,問女何坦營,前線有冥門,據點有坦營。
昨夜軍管區,文賓大點兵;國任十二場;場場對AT;
前線無防滿,隊友無鑲嵌;願為M盾戰,從此發佛心。
東路被放生,西路被蓋傷,南路被集火,北路被肛肛。
~選自卡薩多民歌《木蘭詩》
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.158.76.133
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1525103380.A.7F0.html
※ 編輯: allen20937 (182.158.76.133), 04/30/2018 23:50:47
※ 編輯: allen20937 (182.158.76.133), 04/30/2018 23:51:07
1F:推 Raymond0710: scanf("%c", &answer) 04/30 23:54
※ 編輯: allen20937 (182.158.76.133), 05/01/2018 00:01:57
2F:→ allen20937: 感謝上面的回答,改成%c之後就正常了。 05/01 00:06
3F:→ allen20937: 可以請問一下為何輸入的類型是字元跟字串的差異會造成 05/01 00:07
4F:→ allen20937: 其他變數的改變嗎? 05/01 00:08
5F:→ FancyWing: &answer 是對位址做寫入,而不是變數 05/01 00:14
6F:→ FancyWing: %c 1 byte, %s >1 byte 05/01 00:15
7F:→ FancyWing: 然後你兩個變數恰好是連續位置,寫入大於1Byte就覆蓋了 05/01 00:17
8F:→ FancyWing: 是 pointer 常會遇到的狀況,所以請多小心 05/01 00:19
9F:→ allen20937: 謝謝上面的回答,又學到東西了 05/01 07:33
10F:推 cphe: 可以想像你儲存一個'1'跟"1"在記憶體裡實際的差異,如上面 05/02 01:30
11F:→ cphe: 所說直接用位址操作超出預期範圍就有可能踩到其他東西(相鄰 05/02 01:30
12F:→ cphe: 位址的資料),嚴重的話ap可能直接crash。c的字串操作其實 05/02 01:30
13F:→ cphe: 很麻煩,要算很精準,也就是要非常小心 05/02 01:30