2014-01-21 55 views
-1

什麼是爲temp_comercial temp_active_substance分配內存的正確方法? 這個分配會導致內存泄漏嗎?我只需要一個答案爲字符指針分配內存的正確形式..內存分配可能的內存泄漏

int * temp_quantity; 
void ** temp_pointers; 
char ** temp_comercial_name; 
char ** temp_active_substance; 
char ** temp_manufacturer; 
char ** temp_expiry_date; 
int insertion_index, split, new_key, i, j; 

new_leaf = make_leaf(); 

temp_keys = malloc(order * sizeof(int)); 
if (temp_keys == NULL) { 
    perror("Temporary keys array."); 
    exit(EXIT_FAILURE); 
} 
temp_quantity = malloc(order * sizeof(int)); 
if (temp_quantity == NULL) { 
    perror("Temporary quantity array."); 
    exit(EXIT_FAILURE); 
} 
temp_pointers = malloc(order * sizeof(void *)); 
if (temp_pointers == NULL) { 
    perror("Temporary pointers array."); 
    exit(EXIT_FAILURE); 
} 

temp_comercial_name = malloc(order); 
for(i = 0 ; i < order ; i++) 
    temp_comercial_name[i] = malloc(sizeof(char) * 20); 

temp_active_substance = malloc(order); 
for(i = 0 ; i < order ; i++) 
    temp_active_substance[i] = malloc(sizeof(char) * 20); 

temp_manufacturer = malloc(order); 
for(i = 0 ; i < order ; i++) 
    temp_manufacturer[i] = malloc(sizeof(char) * 20); 

temp_expiry_date = malloc(order); 
for(i = 0 ; i < order ; i++) 
    temp_expiry_date[i] = malloc(sizeof(char) * 20); 
+1

爲C.你更容易找到與這種代碼在標籤經驗的人你或許應該標記這一點。 – juanchopanza

+1

由於在代碼中無法找到一個'free()'調用,所以很可能發生了內存泄漏。 –

+0

也**注**你有指針指向字符指針,而不是簡單的字符指針! –

回答

4

如果泄漏或不..

temp_comercial_name = malloc(order); 
for(i = 0 ; i < order ; i++) 
    temp_comercial_name[i] = malloc(sizeof(char) * 20); 

你必須確保你delete僅此代碼不能決定/ free存儲器中,如下環..

for (i=0; i<order; i++) { 
    free(temp_comercial_name[i]); 
} 
free(temp_comercial_name); 

編輯:free後設置NULL。關於這個話題的討論有很多。

NULL after free or not

+0

'sizeof(char)'是多餘的,因爲標準_guarantees_一個字符的大小必須是「1」。最好還是將內存分配爲'var_name = malloc(n * sizeof(* var_name));',儘管如果您決定更改給定var的類型,您不必再花費更改所有分配相關代碼 –

+0

@EliasVanOotegem完全同意sizeof(char)點! –