開發平台(Platform): (Ex: Win10, Linux, ...)
xp
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
code block
問題(Question):
程式碼交換位置後 執行出現錯誤
餵入的資料(Input):
1234
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <stdio.h>
#include <stdlib.h>
main()
{
char str1[]="";
char *str2="您輸入的字串如上";
printf("請輸入字串:");
fgets(str1,80,stdin);
printf("%s",str1);
printf("%s",str2);
}
以上程式碼 執行時 會出現錯誤
我是按照書本練習打的 執行出現錯誤的是書本範例我自己移到到下方才可以執行 但是不明白為什麼為什麼說兩段都是錯誤的?
上面的那個如果輸入超過4BYTE就溢位修改到str2指標了str2指標錯誤之後,printf("%s",str2);就掛掉了下面那個是str2指標在printf("%s",str1);後才補上運氣好沒掛點,但是兩段code都是零分XD
作者:
ssdoz2sk (眷戀著提拉米蘇的風采~)
2017-11-03 16:25:00燒書了(O
但是我只輸入1234 沒超過4BTYE 還是執行錯誤
作者:
ssdoz2sk (眷戀著提拉米蘇的風采~)
2017-11-03 16:27:00\0
你確定是4BYTE? 還是5BYTE,還是6BYTE? 想清楚唷來4,5,6 BYTE選一個
你strlen看看是不含\0幾BYTE,別在玩記憶體溢位了,駭客級別的程式設計太難
5是包括\0還是不包括\0呢?或者是包括了什麼特殊字元?
strlen是算str1那個字串的長度,要知道陣列不能作為函數參數,會decay成指標,然後沒當的原因是你覆蓋的只是int看起來是32bit環境,那指標是4byte,超過對齊的範圍就會覆蓋到後面的這些都是undefined行為,研究這麼沒營養的東西幹嘛
太難了,str1因記憶體對齊的關係會配到4BYTE如果不是想當駭客的話,不要這樣亂寫程式
請寫char str1[80] = "";而fgets會吃到\n,都要算進去,你都沒處理,都沒教?char str1[]="";同等於 char str1[1]; strl[0] = '\0'
str2在32bit環境是4byte,str1不到4byte,會對齊成4byte研究這個的原理也是浪費時間如果不是有心細究程式在記憶體的架構,就避開這種事
有些遊戲機的破解就是利用遊戲存檔名造成溢位用精心設計的檔名字串把程式碼導向別地方
我是想說 似乎人家都說C語言重視記憶體規劃所以才想說多瞭解一點 這程式記憶體溢位是如何產生
這不是C的層次,而是OS了,如果對PE或ELF有興趣再看