[已解決] 指標變數用 delete 發生記憶體錯誤

Home Home
引用 | 編輯 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
引用 | 編輯 ebolaman
2011-09-30 18:14
2樓
  
下面是引用 Freelife 於 2011-09-30 14:40 發表的 : 到引言文
輸入 "0 0",會當掉是正常的,

pos = new int[lenNum];

當lenNum = 0時,
不就怪怪的......
最小值也要1....


謝謝!

我沒注意到這點


不過我發現就算 沒有輸入 0 0 這個 case 也會隨機地發生記憶體錯誤

後來我改成宣告 pos[10]  後似乎就解決了,但是不懂這個 delete [] pos; 這到底為何會發生錯誤

當初 Debug 就是到這一行  delete [] pos;  發生錯誤

獻花 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 發表的 : 到引言文
這是因為呢.....
你實際存取的記憶體,
超過你動態配置的大小......

例如第二個輸入範例:6 3
你配置3個int的陣列空間
pos = new int[3];

但是,在renew_realloc_pos(...)函式裡面,
你實際存取的pos[]陣列,卻會取到第6個陣列值,
這樣就有記憶體違規存取的問題.....

如果直接宣告成"pos[10] ",
當你存取超過陣列範圍的大小時,
應該也是有問題的


所以,pos 會存取到不該是分配記憶體位置的 區域

卻是在 delete [] pos;  才會發生問題呀


之前的焦點一直注意在 new int[]; 與 delete [] pos;  兩個地方

原來我又犯了 多1或少1 的錯誤了

獻花 x0