[問題] 程式不正常終止?

看板C_and_CPP作者 (葉酸酸)時間15年前 (2010/11/24 16:29), 編輯推噓3(3022)
留言25則, 6人參與, 最新討論串1/1
以下是簡化過的程式碼,compile 可以過, 但執行會 return 5,請問是哪裡有問題嗎?囧 Platform:XP + MinGW Compiler:GCC 3.4.5 (mingw-vista special r3) > -------------------------------------------------------------------------- < // 網頁上色版 http://pastebay.com/110504 #include <stdio.h> #include <stdlib.h> int main(void) { int cx; char *src = "3243f6a8885a308d313198a2e0370734"; unsigned char *dest = (unsigned char *) malloc( 16 * sizeof (unsigned char) ); for (cx = 0; cx < 16; cx++) sscanf(src + cx * 2, "%02X", dest + cx); malloc(16); puts("test"); return 0; } -- One should love animals. They are so tasty. 每個人都應該愛動物,他們是如此美味。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.204.248.250 ※ 編輯: B9 來自: 123.204.248.250 (11/24 16:31)

11/24 16:31, , 1F
dest + cx, 你用到不是你要來的記憶體, cx 最多到 3
11/24 16:31, 1F

11/24 16:31, , 2F
32 位元電腦的話...
11/24 16:31, 2F

11/24 16:32, , 3F
是buffer overflow的關係嗎?
11/24 16:32, 3F

11/24 16:34, , 4F
咦?變數名稱不能用 cx 嗎?
11/24 16:34, 4F

11/24 16:36, , 5F
11/24 16:36, 5F

11/24 16:36, , 6F
等一下我再改一下XD
11/24 16:36, 6F

11/24 16:39, , 7F
跟 cx 這名字無關吧...是你要來的空間太小了
11/24 16:39, 7F

11/24 16:40, , 8F
你應該去要 16*sizeof(int) 這麼多才行
11/24 16:40, 8F

11/24 16:40, , 9F
嗯對,我剛剛想通了……
11/24 16:40, 9F

11/24 16:44, , 10F
我表達的不好...Orz
11/24 16:44, 10F

11/24 16:47, , 11F
不會啦!!我有想到!!
11/24 16:47, 11F
※ 編輯: B9 來自: 123.204.248.250 (11/24 17:00)

11/24 17:00, , 12F
請問現在這樣又是哪裡有問題?還是一樣 return 5
11/24 17:00, 12F

11/24 17:09, , 13F
malloc(16)那行刪掉就可以了
11/24 17:09, 13F

11/24 17:09, , 14F
可是應該不會是 malloc(16) 的問題吧?囧
11/24 17:09, 14F

11/24 17:12, , 15F
請去查查 scanf 家族中 %X 的說明
11/24 17:12, 15F

11/24 17:12, , 16F
事實上這段簡化後的程式嗎本來有 malloc
11/24 17:12, 16F

11/24 17:12, , 17F
ok
11/24 17:12, 17F

11/24 17:14, , 18F
我看到了,type unsigned int...
11/24 17:14, 18F

11/24 17:16, , 19F
ok 我看到了,可是 %x type unsigned int
11/24 17:16, 19F

11/24 17:16, , 20F
我用 unsigned char 來裝,應該會做 implicit type casting
11/24 17:16, 20F

11/24 17:16, , 21F
所以理論上還是可以裝不是嗎?怎麼會掛掉?
11/24 17:16, 21F

11/24 17:28, , 22F
啊……我好像知道了
11/24 17:28, 22F

11/24 17:30, , 23F
是因為傳回來 unsigned int 直接放到 dest + cx
11/24 17:30, 23F

11/24 17:30, , 24F
然後就超過 bond,是這樣嗎?
11/24 17:30, 24F

11/24 17:31, , 25F
所以解法就是先暫存到一個 unsigned int 然後做 type casting
11/24 17:31, 25F
文章代碼(AID): #1CxCpHx7 (C_and_CPP)