为动态数组阵列释放内存

时间:2017-06-01 16:22:50

标签: c arrays memory-leaks dynamic-memory-allocation

好的,所以这些是我的结构:

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);

如果我只写最后一行它,但它不会产生内存泄漏?

2 个答案:

答案 0 :(得分:0)

在这一行中,你为指针向量分配内存

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

然后你将它们记忆为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.

答案 1 :(得分:-1)

编程崩溃的原因有很多:

  1. 您正在访问不存在的Student对象中的name(您已将内存显式设置为null)
  2. 您尚未在name未分配
  3. 时取消分配name
  4. 您正在释放从未初始化的Student指针