释放指针存储器以及指针本身

时间:2017-11-02 18:38:37

标签: c pointers

“Deeltal”跟踪整数有多少分频器(计数)并将它们保存在一个数组(分频器)中。

示例:

value = 8 - > count = 3和dividers = {1,2,4}

value = 10,count = 3,dividers = {1,2,5}

希望一切都清楚,看看下面的代码:

typedef struct{
    int value;
    int count;
    int* dividers;
} Deeltal;


void free_dividers(Deeltal *g){  /*Deletes the int* dividers of a given Deeltal*/
    free (g - > dividers);
}

/* the following two functions have the same purpose: deleting the content of a 
given amount of "Deeltal" AND deleting the pointer to it aswell*/

void free_amountOfdeeltal(Deeltal *d, int amount){
    int i;
    for (i = 0; i < amount; i++){
        free_dividers(&d[i]);
    }
    free(d);
}

void free_amountOfdeeltalVersion2(Deeltal **g, int amount){
    int i;
    for(i = 0; i < amount; i++){
        free_dividers(&(*g)[i]);
    }
    free(*g);
}

如果我的主要看起来像这样

int main(void){
    /*EDIT 3/11/2017: forgot to allocate memory for *d and initializing g.
    Thanks for pointing this out*/

    Deeltal g = 0;
    g.value = 6; g.count = 3; g.dividers = {1,2,3};

    Deeltal *d = malloc(sizeof(Deeltal));
    d->value = 6; d->count = 3; d->dividers = {1,2,3};

    free_amountOfdeeltal(&g);
    free_amountOfdeeltalVersion2(&d);
}

free_amountOfdeeltalfree_amountOfdeeltalVersion2之间有什么区别?

两者都应该做同样的事情:释放Deeltal的内存并删除指向该内存的指针。

旁注: 如何删除内存和指针?

2 个答案:

答案 0 :(得分:1)

尽管如其他人所指出的那样,使用无效数据调用此函数也是如此。我将尝试回答我认为你问的问题。

  

旁注:如何删除内存和指针?

你真的不能删除指针&#34;在这种情况下,指针只是一个分配了地址的变量。通过将free指针传递给内存,可以删除已分配的内存。请注意,free根本不会修改指针的值。 (它不能因为指针是按值传递的。)在调用free之后,指针仍然指向相同的存储器地址。

如果你的意思是&#34;我怎样才能为指针分配一个有意义的值来识别它的内存已被删除,&#34;那么你可以使用函数的第二种形式:

void free_amountOfdeeltalVersion2(Deeltal **g, int amount);

并在返回之前将*g设置为NULL。然后,您可以使用此信息,而不是指针为NULL,以标识已删除的内存。

答案 1 :(得分:0)

您没有为d分配任何内存,因此您的指针不指向任何结构。因此,您无法访问其属性或释放其内存,因为您没有首先保留它。这段代码无法远程编译。

首先,您应该为“Deeltal”结构分配内存,如下所示:

Deeltal *d = malloc(sizeof(Deeltal));

我建议你回去重新学习指针是如何工作的,因为你在那里做了一些非常奇怪的事情。