[問題] 字串輸出疑問

看板C_and_CPP (C/C++)作者 (宸火)時間8年前 (2017/11/03 15:59), 8年前編輯推噓3(3038)
留言41則, 5人參與, 8年前最新討論串1/1
開發平台(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); } 以上程式碼 執行時 會出現錯誤 ------------------------------------------ #include <stdio.h> #include <stdlib.h> main() { char str1[]=""; printf("請輸入字串:"); fgets(str1,80,stdin); printf("%s",str1); char *str2="您輸入的字串如上"; printf("%s",str2); } 將 char *str2="您輸入的字串如上"; 這段移動到下方 就可以正常執行 不明白為什麼 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.220.35.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1509695947.A.7F8.html

11/03 16:09, 8年前 , 1F
沒有為什麼,剛好而已。兩段都是錯的。
11/03 16:09, 1F

11/03 16:11, 8年前 , 2F
我是按照書本練習打的 執行出現錯誤的是書本範例
11/03 16:11, 2F

11/03 16:11, 8年前 , 3F
我自己移到到下方才可以執行 但是不明白為什麼
11/03 16:11, 3F

11/03 16:12, 8年前 , 4F
為什麼說兩段都是錯誤的?
11/03 16:12, 4F

11/03 16:18, 8年前 , 5F
上面的那個如果輸入超過4BYTE就溢位修改到str2指標了
11/03 16:18, 5F

11/03 16:19, 8年前 , 6F
str2指標錯誤之後,printf("%s",str2);就掛掉了
11/03 16:19, 6F

11/03 16:20, 8年前 , 7F
下面那個是str2指標在printf("%s",str1);後才補上
11/03 16:20, 7F

11/03 16:21, 8年前 , 8F
運氣好沒掛點,但是兩段code都是零分XD
11/03 16:21, 8F

11/03 16:25, 8年前 , 9F
燒書了(O
11/03 16:25, 9F

11/03 16:26, 8年前 , 10F
但是我只輸入1234 沒超過4BTYE 還是執行錯誤
11/03 16:26, 10F

11/03 16:27, 8年前 , 11F
\0
11/03 16:27, 11F

11/03 16:28, 8年前 , 12F
你確定是4BYTE? 還是5BYTE,還是6BYTE? 想清楚唷
11/03 16:28, 12F

11/03 16:30, 8年前 , 13F
來4,5,6 BYTE選一個
11/03 16:30, 13F

11/03 16:33, 8年前 , 14F
加上 \0 應該是 5BYTE 吧
11/03 16:33, 14F
維持 第一個程式的順序 改為輸入 A 執行不會有錯誤 但是 printf("%s",str2);的功能沒有顯示出來 輸出如下=> 請輸入字串:1 1 --------------------------------------- 改為輸入 AB 執行還是有錯誤 當機 這次應該沒超過4 Byte了吧? 為什麼還是有錯誤 ※ 編輯: x246libra (61.220.35.157), 11/03/2017 16:45:15

11/03 16:43, 8年前 , 15F
你strlen看看是不含\0幾BYTE,
11/03 16:43, 15F

11/03 16:51, 8年前 , 16F
別在玩記憶體溢位了,駭客級別的程式設計太難
11/03 16:51, 16F

11/03 16:53, 8年前 , 17F
用了strlen 輸入1234 是得到5
11/03 16:53, 17F

11/03 16:56, 8年前 , 18F
5是包括\0還是不包括\0呢?
11/03 16:56, 18F

11/03 16:57, 8年前 , 19F
或者是包括了什麼特殊字元?
11/03 16:57, 19F
main() { char str1[]=""; int n; fgets(str1,80,stdin); printf("%d",strlen(str1)); } 單純使用 strlen 輸入1234 輸出5 ※ 編輯: x246libra (61.220.35.157), 11/03/2017 17:02:37

11/03 17:06, 8年前 , 20F
strlen是算str1那個字串的長度,要知道陣列不能作為
11/03 17:06, 20F

11/03 17:07, 8年前 , 21F
函數參數,會decay成指標,然後沒當的原因是你覆蓋的
11/03 17:07, 21F

11/03 17:08, 8年前 , 22F
只是int
11/03 17:08, 22F
stupid0319: 上面的那個如果輸入超過4BYTE就溢位修改到str2指標了 這段話 老實說 我不太懂 不知道是否可以再說明一下 為什麼不可以超過4byte? 程式碼中 fgets(str1,80,stdin); 不是說可以可以使用80個字元嗎? 如果真的4BYTE就溢位 又什麼會修改到str2指標? 他們的記憶體位置有連續嗎? ※ 編輯: x246libra (61.220.35.157), 11/03/2017 17:10:36

11/03 17:25, 8年前 , 23F
看起來是32bit環境,那指標是4byte,超過對齊的範圍
11/03 17:25, 23F

11/03 17:26, 8年前 , 24F
就會覆蓋到後面的
11/03 17:26, 24F

11/03 17:27, 8年前 , 25F
這些都是undefined行為,研究這麼沒營養的東西幹嘛
11/03 17:27, 25F

11/03 17:28, 8年前 , 26F
太難了,str1因記憶體對齊的關係會配到4BYTE
11/03 17:28, 26F
請問一下 是因為這句程式 char str1[]=""; 所以str1才被配到4Byte嗎?

11/03 17:29, 8年前 , 27F
如果不是想當駭客的話,不要這樣亂寫程式
11/03 17:29, 27F

11/03 17:30, 8年前 , 28F
我對這個小有涉獵,雖然是很久以前的事
11/03 17:30, 28F
只是想瞭解後面的原理 只是個初學者 沒特別想這樣寫程式 ※ 編輯: x246libra (61.220.35.157), 11/03/2017 17:32:38

11/03 17:30, 8年前 , 29F
請寫char str1[80] = "";
11/03 17:30, 29F

11/03 17:32, 8年前 , 30F
而fgets會吃到\n,都要算進去,你都沒處理,都沒教?
11/03 17:32, 30F

11/03 17:36, 8年前 , 31F
char str1[]="";同等於 char str1[1]; strl[0] = '\0'
11/03 17:36, 31F

11/03 17:36, 8年前 , 32F
str2在32bit環境是4byte,str1不到4byte,會對齊成4by
11/03 17:36, 32F

11/03 17:36, 8年前 , 33F
te
11/03 17:36, 33F

11/03 17:38, 8年前 , 34F
研究這個的原理也是浪費時間
11/03 17:38, 34F
謝謝以上的回答 那就不再研究下去了 至少讓我知到了 不到4Byte 會自動對齊到 4Byte 感謝各位的回答 原本也只是好奇 為什麼書本說可以執行 但是我卻不能 沒特別想說要研究記憶體溢位 ※ 編輯: x246libra (61.220.35.157), 11/03/2017 17:41:55

11/03 17:39, 8年前 , 35F
如果不是有心細究程式在記憶體的架構,就避開這種事
11/03 17:39, 35F

11/03 17:40, 8年前 , 36F
有些遊戲機的破解就是利用遊戲存檔名造成溢位
11/03 17:40, 36F

11/03 17:41, 8年前 , 37F
用精心設計的檔名字串把程式碼導向別地方
11/03 17:41, 37F

11/03 17:42, 8年前 , 38F
我是想說 似乎人家都說C語言重視記憶體規劃
11/03 17:42, 38F

11/03 17:43, 8年前 , 39F
所以才想說多瞭解一點 這程式記憶體溢位是如何產生
11/03 17:43, 39F

11/03 17:45, 8年前 , 40F
這不是C的層次,而是OS了,如果對PE或ELF有興趣再看
11/03 17:45, 40F

11/03 17:48, 8年前 , 41F
謝謝您的熱心回答
11/03 17:48, 41F
文章代碼(AID): #1P_27BVu (C_and_CPP)
文章代碼(AID): #1P_27BVu (C_and_CPP)