看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 我目前需要使用一個 function 來修改某個陣列的長度及內容 例如: void change(int *a, int &length) { delete [] a; length += 2; a = new int [length]; for(int i=0;i<length;i++) a[i] = i+1; } //把陣列的長度加 2 int main() { int length = 3; int *a = new int [length]; for(int i=0;i<length;i++) a[i] = i+1; change(a, length); for(int i=0;i<length;i++) cout<<a[i]<<" "; cout<<endl; //應該印出 1 2 3 4 5 change(a, length); //再一次 for(int i=0;i<length;i++)cout<<a[i]<<" "; //應該印出 1 2 3 4 5 6 7 delete [] a; return 0; } 上面這個例子的確有跑出預想的結果 但是實際的大程式卻會出問題 而且還是很怪的問題: 陣列 a 的內容在被傳入 change() 一次之後內容沒錯 但是將陣列 a 第二次傳入 change() 之後 回到 main() 以後, a[0] a[1] ... 都變成垃圾值 如果以上的寫法沒有什麼隱藏問題 那我就朝其他方向 debug 了 orz 謝謝各位 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) dev-c++ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.43.22 ※ 編輯: jackwei 來自: 118.160.43.22 (09/18 11:49)
LPH66:你沒把你 new 出來的 a 給送回去 09/18 11:57
LPH66:注意這裡的 a 是 call by value (of the addr of an array) 09/18 11:57
nowar100:我決定這幾天加入第十三誡 這問題也被問到快爛了 XD 09/18 12:05
※ 編輯: jackwei 來自: 118.160.43.22 (09/18 12:14)
wu110011:那為什麼第一次可以成功呼叫? 09/18 12:15
jackwei:上面提供的程式碼 第幾次好像都會對耶 09/18 12:25
littleshan:因為運氣好的話delete後再new可能會得到一樣的位址 09/18 12:30
jackwei:謝謝 好像知道原理了 那應該用什麼方法達到這個目的呢 09/18 12:49
proLIONS:you should use **a instead of *a 09/18 12:50
proLIONS:you may think of **a as something like *a[] 09/18 12:51
james732:這個真的很容易錯...XD 09/18 14:57
tinlans:一般這種函式設計還是會傳回一個 pointer 吧。 09/18 15:44
LPH66:所以我一樓推的是"送回去" 藉參數列或回傳值送回去兩者皆可 09/18 16:12
yayarice:我都是在function input寫double& *a耶 09/19 20:42