2010-07-22 80 views
4

我剛開始學習C和(當然)與指針:)指針最佳實踐

掙扎鑑於此片段:

int *storage, *storage_p; 
storage = malloc(sizeof(int[GROW_BY])); 
storage_p = storage; 
// do something with storage, using storage_p 
free(storage); 
storage = NULL; 

是否真正有必要聲明的兩個變量一起工作malloc()'ed數據?按照我的方式創建storagestorage_p是不是很好?如果不是,那麼'這樣'會是什麼?

+0

不完全是你的問題,但它*是一個很好的習慣來清空你已經釋放的指針,或者你知道你不需要從這段代碼中再次使用。 – ndim 2010-07-22 19:13:01

+0

當兩個指針指向相同的內存並釋放一個內存時,代碼是危險的。 – 2010-07-22 19:14:16

+0

@ndim:我知道,我已經閱讀過有關指針的每一個參考文獻,這是非常清楚的說明!編輯:我現在看到你的意思是我也應該NULL storage_p,我會的! – 2010-07-22 19:15:39

回答

3

您將需要一個指針,將舉行)通過的malloc(返回的值,所以你可以稍後釋放它。

如果你計劃使用storage_p將會改變它的值,那麼你將需要兩個指針。

但是,我通常保持純初始指針,並創建新的,特設的,因爲我需要一個。

int *storage = (int*) malloc(sizeof(int[GROW_BY])); 
// : 
int* ptr = storage; 
while (*ptr) 
{ 
    // : 
    ++ptr; 
} 
+0

這就是我的情況。我在一個循環中使用了「存儲」(遞增),當我調用'free()'時,我得到了段錯誤。我想我的描述不夠清楚。因此,回顧一下,除非必須修改指針,否則通常不會創建副本。那是對的嗎? – 2010-07-22 19:13:29

+0

這是正確的。 – 2010-07-22 19:15:29

+0

謝謝,這些都是一些好的指針;) – 2010-07-22 19:20:44

1

我會建議不要有指針的副本。它只會增加隨意使用懸掛指針的機會,您可能會稍後意外使用它,或者增加一個額外的副本,但這些額外的副本可能並不是免費的,或者是您可能不希望雙倍使用的額外副本。我不認爲在這裏需要storage_p

GOOL「醇:

int *storage = malloc(size_of_whatever); 
storage[0] = do_something(); 
free(storage); 
storage = NULL; 

就可以了。

1

不,我不明白你在哪裏通過storagestorage_p獲得任何東西。我通常只有其中一個。

0

這對我來說似乎沒有必要。我不確定中間部分可能是什麼,但我看不到任何有利於別名的指針 - 除非你正在修改storage_p(例如,遞增它來迭代)。事實上,擁有兩個別名指針可能會讓跟蹤分配的內存變得更加困難。

2

我只會複製一個由malloc創建的指針,原因有一個:我想修改它。

例如,如果您正在迭代通過malloc分配的字符數組,我會將指針複製到一個新變量以迭代並保持第一個變量不變。

而且,當涉及到動態分配,看看免費名單,它們可以簡化很多:

http://en.wikipedia.org/wiki/Free_list

+0

謝謝,我會研究他們。 – 2010-07-22 19:14:31

1

你可能想這樣做的原因是因爲你做storage幾個操作後,你可能不記得什麼free()。有storage_p作爲副本,你永遠不會修改有助於防止內存泄漏,因爲你可以稍後調用free(storage_p),無論storage發生了什麼。這是否超過已經提到的缺點取決於具體情況。

一個例子:

int *storage; 
storage = malloc(sizeof(int[GROW_BY])); 
storage++; 
free(storage); //SEGFAULT or MEMORY LEAK or OTHER BAD STUFF 
storage = NULL; 

VS

int *storage, *storage_p; 
storage = malloc(sizeof(int[GROW_BY])); 
storage_p = storage; 
storage++; 
free(storage_p); 
storage_p=NULL; 
storage = NULL; 
0

沒有內在原因重新分配其malloc分配到另一個指針的空間。

如果有的話,它會只是不必要地添加線條和妥協的可讀性。