線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1931
推到 Plurk!
推到 Facebook!

C語言 動態配置記憶體 寫成函數型態 一些問題

答題得分者是:arisaka_matsuri
leatica
一般會員


發表:1
回覆:0
積分:0
註冊:2008-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-21 00:59:04 IP:218.168.xxx.xxx 訂閱
大家好,我想請教一個動態配置記憶體的問題。

我現在要寫一個函數,其目標為產生兩個動態記憶體空間實現二維陣列(m列,n行),因此我想透過產生m個長度為n的空間作為二維陣列
各行的內容,再產生一個長度為m的空間用來存放m個指標,其指向先前m個長度為n的空間個別的首位址,最後再用一個指標指向存放
m個指標的空間的首位址。

使用方法:
1.呼叫這個函數時傳入m,n(代表列數,行數)兩個值。
2.此函數回傳一個 **ptr (指標 指標??)來表示已建立的空間。
3.此時 *(*(ptr row) column) 可表示該記憶體空間位置在row列column行位址上的值。

我已經把程式寫好了,測試時發現的現象:
1.產生的列數為 81列4行 時是可以的,但如果變成82列4行就會跳出"發生問題 必須關閉 謹此致歉"然後"不回報"的對話框。
2.加入了free(ptr_2) (現在在程式裡是註解的狀態) 之後就可以突破先前的維度限制,但printf 出來的值 明明 有memset過
但還是變成0xCD。

請問:
1.這個程式為什麼會有維度的限制?
2.如果加入free(ptr_2)之後會否造成之後如果再呼叫另一個空間出來,會與先前的空間有所重疊?
3.這個程式還有哪些令人看不順眼、Bug的地方?
4.如何將取得的**ptr所指的空間做釋放?

謝謝<(__ __)>

[code cpp]
#include
#include
#include

unsigned char **memory_allcation(unsigned char row,unsigned char column) //資料型態為指標指標的函數
{
unsigned char j,*ptr_2=NULL,**ptr_1 = NULL;
ptr_1 = (unsigned char**)malloc(row);//產生一個空間去存放指向各行的指標
memset(ptr_1,0,sizeof(unsigned char**)*row);//先預設為0
for(j=0;j {
ptr_2 = (unsigned char*)malloc(column);//產生的空間為column個byte
memset(ptr_2,0,sizeof(unsigned char)*column);//將產生的空間設定為0
*(ptr_1 j) = ptr_2;//將要回傳的ptr_1指向產生出的空間
//free(ptr_2);//到底該不該產生完後就釋放呢?
}
return ptr_1;//回傳
}

void main()
{
unsigned char **mem_space_1=NULL,m=2,n=3; //定義一個(指標-指標?)做為指向被產生的記憶體空間的指標
mem_space_1 = memory_allcation(m,n);//呼叫函數輸入m,n兩個值,回傳一個(指標-指標?)指向產生的空間
}
[/code]
編輯記錄
leatica 重新編輯於 2008-12-21 01:07:12, 註解 無‧
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-23 20:44:44 IP:140.113.xxx.xxx 訂閱
你好,
如果沒有特別的限制
建議用new, delete來處理動態記憶體的配置與釋放比較簡單
站上也有資料可以參考

你的程式在第7行
ptr_1 = (unsigned char**)malloc(row);//產生一個空間去存放指向各行的指標
有問題
malloc()的參數應該用 sizeof(
unsigned char* ) * row 而不是 row
原因在第8行,你自己寫出來了
如果還不懂,自己比較看看 sizeof(int), sizeof(int *), sizeof(char), sizeof(char *)

第14行的
free(ptr_2)當然不應該存在
配出來的空間又釋放掉,如果要去使用那註定是要出事的

所以你的問題的解答
1.這個程式為什麼會有維度的限制?
A:因為你寫錯了

2.如果加入free(ptr_2)之後會否造成之後如果再呼叫另一個空間出來,會與先前的空間有所重疊?
A:只有作業系統知道會不會

3.這個程式還有哪些令人看不順眼、Bug的地方?
A:如前述

4.如何將取得的**ptr所指的空間做釋放?
A:將操作順序顛倒,亦即先釋放ptr1中每個指標所指向的位置
最後釋放ptr1指標的指標所指向的位置
編輯記錄
arisaka_matsuri 重新編輯於 2008-12-23 20:46:14, 註解 無‧
系統時間:2024-04-27 3:53:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!