2013-04-08 63 views
0

後,我在記憶中這個函數返回一個void *的指針一大塊:Chaning返回的指針,它已經返回在C++

memory.cpp:

int mem[1000]; 
int* pointers[100]; 
int start_index = 100; 

void* allocate(int size) { 
    pointers[0] = &mem[start_index]; 
    return (void *) pointers[0]; 
} 

main.cpp中:

int* arr = (int*) allocate(50); // allocate array of size 50 starting at mem[100] 
arr[0] = 62;     // changes mem[100] to 62 

現在我想讓這個函數的用戶使用mem數組的不同位置,而不需要分配函數的用戶被通知(假設它沒有問題,我們會丟失數據)。

我不能這樣做嗎?

memory.cpp:

pointers[0] = &mem[200]; 

後這一行memory.cpp執行,我想arr[0]mem[200]。 有沒有可能不改變分配函數的原型?

謝謝

+0

對,修復它在問題描述中。 – Allen1200 2013-04-08 05:52:12

回答

1

不,你不能。您需要返回一個指針指針(void**),並且使allocate函數的客戶端完全清楚它們不允許爲內存創建別名。無論如何,這是一個不好的主意,你會遇到問題左右(例如,如果你的客戶使用就地new在該內存中分配非POD對象會怎麼樣?)

+0

啊,謝謝。那是我正在尋找的答案。儘管我不允許改變分配函數的原型,否則'void **'就是解決方案。 – Allen1200 2013-04-08 06:00:39

1

是的,你可以改變指針指向別的任何時間。

但是,這隻會改變您分配給的指針,而不會改變使用舊指針的其他地方。因此,如果某些代碼保存從allocate函數返回的值,並且稍後將pointers[0]更改爲指向其他內容,舊保存的指針將不會更改。

+0

對,所以沒有辦法改變'arr'指向的內存,在memory.cpp裏面? – Allen1200 2013-04-08 05:56:51

+0

@ user2256172不,沒有。 – 2013-04-08 05:58:13