引用 | 編輯
ebolaman
2011-09-16 13:44 |
樓主
▼ |
||
x0
最近練一個類似 Online Judge 的題目,結果一直錯誤,請教如何解決題目 : https://gpe2.acm-icpc.tw//showproblemtab.php?probid=2008-01&cid=2 我寫的 C 程式碼 : #include<stdio.h> #include<stdlib.h> /*========== Prototype ==========*/ void renew_realloc_pos(int*, int, int*); bool renew_plus_pos(int*, int*, int*); /*_______________________________*/ int main() { int maxNum = 0, lenNum = 0; int val_case = 1; int* pos; while (scanf("%d %d", &maxNum, &lenNum) == 2) { /*----- Initialize -----*/ pos = new int; pos = 1; renew_realloc_pos(pos, 1, &maxNum); /*----- Output -----*/ int rep = 1, i = 0; printf("case .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
Freelife
2011-09-30 14:40 |
1樓
▲ ▼ |
輸入 "0 0",會當掉是正常的,
pos = new int[lenNum]; 當lenNum = 0時, 不就怪怪的...... 最小值也要1.... x1 |
引用 | 編輯
Freelife
2011-10-03 10:02 |
3樓
▲ ▼ |
這是因為呢.....
你實際存取的記憶體, 超過你動態配置的大小...... 例如第二個輸入範例:6 3 你配置3個int的陣列空間 pos = new int[3]; 但是,在renew_realloc_pos(...)函式裡面, 你實際存取的pos[]陣列,卻會取到第6個陣列值, 這樣就有記憶體違規存取的問題..... 如果直接宣告成"pos[10] ", 當你存取超過陣列範圍的大小時, 應該也是有問題的 x1 |
引用 | 編輯
ebolaman
2011-10-03 21:29 |
4樓
▲ |
下面是引用 Freelife 於 2011-10-03 10:02 發表的 : 所以,pos 會存取到不該是分配記憶體位置的 區域 卻是在 delete [] pos; 才會發生問題呀 之前的焦點一直注意在 new int[]; 與 delete [] pos; 兩個地方 原來我又犯了 多1或少1 的錯誤了 x0 |