2017-06-01 87 views
-2

確定的動態數組,所以這些都是我的結構:釋放內存數組

struct Student 
{ 
    int id; 
    char* name; 
}; 

struct HashTable 
{ 
    int size; 
    int noElements; 
    Student** elements; 
}; 

在這裏,我分配內存數組的動態數組

ht.elements = (Student**)malloc(size*sizeof(Student*)); 
memset(ht.elements, NULL, size*sizeof(Student*)); 

我的問題是,當我嘗試釋放這樣的內存,爲什麼我的程序崩潰?

for(int i=0;i<ht.size;i++) 
{ 
free(ht.elements[i]->name); 
free(ht.elements[i]); 
} 
free(ht.elements); 

如果我只寫最後一行它的工作,但它不會產生內存泄漏?

+0

@πάνταῥεῖ這是無效C. – user2079303

+1

@ user2079303所以consdier以刪除C標籤也;-) –

+0

@πάνταῥεῖ好主意! (這可能會保護這個問題不受浪費)@CanciuCostin,請說明您正在使用哪種語言。 – user2079303

回答

-1

有很多原因,你的程序崩潰:

  1. 您正在訪問的Student對象name不存在(您明確設置內存爲null)
  2. 您重新分配namename尚未分配
  3. 您解除分配Student指針從未被初始化
+0

問題中沒有程序。甚至沒有有效的C代碼。 – Olaf

0

在這一行你的指針

ht.elements = (Student**)malloc(size*sizeof(Student*)); 

,然後你memseting他們爲NULL的矢量分配內存。這意味着你沒有一個元素矩陣,而是一個指向指向任何元素的元素的指針向量。 因此,這些線路會引起問題

free(ht.elements[i]->name) // here you are dereferencing a null pointer, this will cause a segmentation fault 
free(ht.elements[i]); // here you are calling free on a null pointer. Depending on your compiler, this could cause problems.