廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5091 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] [已解決] 指標變數用 delete 發生記憶體錯誤
最近練一個類似 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 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



[ 此文章被ebolaman在2011-10-03 21:30重新編輯 ]



My BOINC stats :

獻花 x0 回到頂端 [樓 主] From:臺灣教育部 | Posted:2011-09-16 13:44 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

輸入 "0 0",會當掉是正常的,

pos = new int[lenNum];

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

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


獻花 x1 回到頂端 [1 樓] From:臺灣中華電信股份有限公司 | Posted:2011-09-30 14:40 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 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;  發生錯誤

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


My BOINC stats :

獻花 x1 回到頂端 [2 樓] From:臺灣教育部 | Posted:2011-09-30 18:14 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

這是因為呢.....
你實際存取的記憶體,
超過你動態配置的大小......

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

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

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

此文章被評分,最近評分記錄
財富:50 (by ebolaman) | 理由: 謝謝!下次分配記憶體時我要更注意一下長度的宣告!


獻花 x1 回到頂端 [3 樓] From:臺灣中華電信股份有限公司 | Posted:2011-10-03 10:02 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 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 的錯誤了


My BOINC stats :

獻花 x0 回到頂端 [4 樓] From:臺灣教育部 | Posted:2011-10-03 21:29 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.081045 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言