2012年10月25日 星期四

[cpp] return address example

[cpp] return address  example

在C++中傳遞陣列或傳回陣列一律使用傳遞記憶體位址的方法,因為陣列名稱本身就是個 指標,儲存有位址資訊。


#include <iostream> 
using namespace std; 

int* createArray(int);
void deleteArray(int*);

int main() { 

 int m = 10; 
 int *arr = createArray(m); 

 for(int i = 0; i < m; i++) {
     arr[i] = i; 
 }
 
 for(int i = 0; i < m; i++) {
     cout << "arr[" << i << "] = " << arr[i] << endl; 
 }
 
 cout << arr << endl;
 cout << arr[3] << endl;

 deleteArray(arr);

 cout << arr << endl;
 cout << arr[3] << endl;

 return 0; 

} 

// 傳回建立的陣列位址
int* createArray(int m) { 
 
 int *a = new int[m]; // 動態配置方式

 cout << "new a[" << m << "]" << endl;
 
 for(int i = 0; i < m; i++) {

     a[i] = 0;
     cout << "a[" << i << "] = " << a[i] <<  endl;
 }
 
 cout << a <<  endl;
 return a; // 傳回建立的陣列位址

}

void deleteArray(int* arr) {
 delete [] arr; 
}

Output:
new a[10]    ---> new "array a" and initial
a[0] = 0     ---> assign initial value
a[1] = 0
a[2] = 0
a[3] = 0
a[4] = 0
a[5] = 0
a[6] = 0
a[7] = 0
a[8] = 0
a[9] = 0
0x8051438    ---> cout "array a" address 
arr[0] = 0   ---> assign value
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 4
arr[5] = 5
arr[6] = 6
arr[7] = 7
arr[8] = 8
arr[9] = 9
0x8051438    ---> 尚未 delete "array arr"
3            ---> 尚未 delete "array arr"
0x8051438    ---> 已經 delete "array arr"
-1785358955  ---> 已經 delete "array arr"


由於您使用動態配置的方式,所以在使用delete之前,這塊被配置的記憶體並不會自動清除,所以您可以直接傳回 給呼叫函式的主函式,注意如果您不是使用 new來配置,則在副函式中所宣告的變數記憶體,在式執行結束後都會自動消失,則您傳回指標值也就沒有意義,也會造成存取錯誤,因為該塊記憶體在副函式 執行完畢後已經自動回收了。

Ref :
http://caterpillar.onlyfun.net/Gossip/CppGossip/returnBy.html

沒有留言:

張貼留言