[問題] 請教函數回傳陣列指標的問題

看板C_and_CPP作者 (Zcode)時間12年前 (2013/06/02 15:15), 編輯推噓2(206)
留言8則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dec-C++ 4.9.9.2 問題(Question): 大家好,小弟想請教2個函數回傳陣列指標的問題: 問題1,code如下: double* funct() { double mat[5]={3,6,8,12,13}; //設置一維陣列並指定陣列元素數值 cout << "in funct:" << endl; for (int i=0; i<5 ; i++) cout << mat+i << "\t"; //印出陣列元素記憶體位置 cout << endl; for (int i=0; i<5 ; i++) cout << *(mat+i) << "\t"; //印出陣列元素數值 return mat; //回傳給main陣列mat的記憶體位置(指標) } int main() { double* mat_main; mat_main = funct(); //mat_main接收funct中mat的記憶體位置 cout << endl << "in main:" << endl; for (int i=0; i<5 ; i++) cout << mat_main+i << "\t"; //印出陣列元素記憶體位置 cout << endl; for (int i=0; i<5 ; i++) cout << *(mat_main+i) << "\t"; //印出陣列元素數值 system("pause"); return 0; } 結果: in funct: 0xbf8fa748 0xbf8fa750 0xbf8fa758 0xbf8fa760 0xbf8fa768 3 6 8 12 13 in main: 0xbf8fa748 0xbf8fa750 0xbf8fa758 0xbf8fa760 0xbf8fa768 -2.07167e-41 -2.07167e-41 4.86669e-270 2.12864e-313 8.48798e-314 網頁程式碼:http://ideone.com/XxVedC 問題1: 我在函數funct中設了一維陣列的數值,然後回傳陣列的記憶體位置(指標)回main函數 記憶體位置有正確回傳到main中,也成功可以印出 但是用*(mat_main+i),為什麼沒有辦法print出在funct函數中的一維陣列的數值呢? 我想了一下原因 是不是因為funct中的mat是一個區域變數,所以funct呼叫完返回main就釋放掉了? 可是我覺得,雖然是釋放掉了,但是釋放掉的應該是mat與記憶體位置0xbf8fa748的連結 而0xbf8fa748 0xbf8fa750....等等記憶體上的「殘值」,應該是還保留著吧? 為什麼我返回main中就print不出來了呢? 問題2: 接續問題1,我把funct中的一為陣列mat改為動態記憶體配置: double *mat; mat = new double[5]; mat[0] = 3; mat[1] = 6; mat[2] = 8; mat[3] = 12; mat[4] = 13; 網頁程式碼:http://ideone.com/oZBoKp 為什麼就可以成功在main中印出函數funct中mat的陣列數值呢? @@" 萬分感謝!:) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.233.138 ※ 編輯: Zcode 來自: 118.168.233.138 (06/02 23:18)

06/02 23:29, , 1F
1.這些暫時的變數記憶體位置是共用的,
06/02 23:29, 1F

06/02 23:29, , 2F
問題1 難保其他不是你寫的程式用到了那些地方
06/02 23:29, 2F

06/02 23:29, , 3F
所以int i即cout等都會把你的殘值蓋掉
06/02 23:29, 3F

06/02 23:30, , 4F
(而且在這裡的確有: 你在 funct() 之後的那一些 cout << xx)
06/02 23:30, 4F

06/02 23:33, , 5F
問題2 這次可以就是因為 mat 陣列所在並不是區域變數了
06/02 23:33, 5F

06/02 23:33, , 6F
所以其他地方使用區域變數就跟這塊區域沒有關係
06/02 23:33, 6F

06/02 23:34, , 7F
再說 new 來的東西其他地方除非被告知不然用不到那個地方
06/02 23:34, 7F

06/02 23:38, , 8F
喔! 原來是這樣! 真的很感謝樓上兩位! 萬分感謝! :D
06/02 23:38, 8F
文章代碼(AID): #1Hgs6POm (C_and_CPP)