2016-01-29 71 views
0
int main(){ 
    struct Map map; 
    readInMap(&map); 
    return 0; 
} 
void readInMap(struct Map * map){ 
    //do stuff 
} 

因此,當我發送地圖地址作爲參數我冒着某種內存分配錯誤?我找不到任何與此有關的問題,因爲我缺乏一些關於我在做什麼的詞彙。我也研究過memallocation,並且會喜歡個人參考,這些參考可以很好地解釋指針的相關內容。我從來沒有學過,在類我是否需要爲我沒有明確定義的指針分配內存?

謝謝

編輯:我試圖找出執行我要執行的操作,以該文件的內存使用效率最高的方式。我濫用c中的指針,並發現其他線程與其他相關信息,以幫助我解決問題,像valgrind

+1

你不爲指針分配內存 - 你有一個指針_。你爲對象分配內存_it指向_。說,現在想一想:這個對象是什麼,它在哪裏分配? – Olaf

回答

0

你的代碼沒問題。函數參數總是被複制,所以原始變量可以保持不變。基本上在你的函數中,你將會有一個叫做struct Map* map的局部變量,它是指向一個地址的指針。當你用readInMap(&map);調用它時,你將映射地址複製到該局部變量struct Map* map,該變量將只存在於readInMap函數中。

你不會冒任何內存分配錯誤。你不必初始化任何東西,因爲你只有一個指針,就是這樣。

至於代碼優化,這實際上是將結構作爲參數傳遞的最佳方式,因爲您只複製地址而不是整個結構。讓我們來看看另一個例子:

typedef struct Node { 

char string[100]; 
int variable1; 
int array[50]; 
} node; 

如果用void readInMap(node map)聲明你的功能,當你真正調用從主(如函數參數,你給結構變量,而不是指向結構),將在功能readInMap發生什麼這個功能?正如我之前所說,scienes背後發生的事情是:函數將創建它自己的node map變量,並複製您傳遞給該局部變量的參數中的所有值。所以在我寫的這個結構中,它將不得不拷貝數組和變量,而且根本沒有進行優化。

所以你可以簡單地通過像void readInMap(struct Map * map)這樣聲明函數來解決這個問題。現在只有地址被複制,而不是整個結構,這是使用結構時的最佳優化。

+0

謝謝,這完美地回答了我的問題 –

3

這很好,您將地圖(您在堆棧上創建的)的地址傳遞給readInMap功能。

struct Map map;行爲你分配內存(在堆棧上),所以你有一個有效的struct來取地址。

+0

通過使用這種方法,並保留所有功能在一個文件中,可能會需要它我是最有效的?我想優化我的程序,創建,讀入並在一個文件中找到迷宮中的路徑 –

+1

效率與您有多少源文件無關。首先關注獲得工作解決方案。 –

1

您傳遞在堆棧中自動分配的變量的地址。你不會冒這樣的錯誤記憶。

+0

OP的代碼分配內存。它通過定義'struct Map map'來實現。這將如何回答OP的問題。 – alk

+0

我對這兩件事足夠了解,這確實有助於我更廣泛地理解事物。謝謝! –

+0

在我的理解中,當有人談論內存分配時,這意味着他會「手動」(使用malloc)。 OP還表示,他缺乏詞彙,因此我指出堆/堆問題。 – seb

相關問題