“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_amountOfdeeltal
和free_amountOfdeeltalVersion2
之间有什么区别?
两者都应该做同样的事情:释放Deeltal
的内存并删除指向该内存的指针。
旁注: 如何删除内存和指针?
答案 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));
我建议你回去重新学习指针是如何工作的,因为你在那里做了一些非常奇怪的事情。