本帖最后由 Lonerwcq 于 2021-2-11 16:38 编辑
这里释放内存的两种方法,为什么有一个会提示使用未初始化的内存?
然后,为什么单链表2小甲鱼改成了二级指针,好像一级指针传入的结构体地址也可以释放?
望大佬解答,全部的代码如下:#include <stdio.h>
#include <stdlib.h>
struct Num
{
int data;
struct Num *next;
};
void addnum(struct Num **);
void getInput(struct Num *);
void printnum(struct Num *);
void release(struct Num **);
int main(void)
{
struct Num *head = NULL;
char ch;
while (1)
{
printf("是否需要录入数字?(Y/N):");
do
{
ch = getchar();
} while (ch != 'Y' && ch != 'N');
if (ch == 'Y')
{
addnum(&head);
}
else
{
break;
}
}
printf("是否需要打印数字?(Y/N):");
do
{
ch = getchar();
} while (ch != 'Y' && ch != 'N');
if (ch == 'Y')
{
printnum(head);
}
release(&head);
return 0;
}
void addnum(struct Num **arr_head)
{
struct Num *num, *ptr;
num = (struct Num *)malloc(sizeof(struct Num));
if (num == NULL)
{
printf("内存分配失败");
exit(1);
}
getInput(num);
if (*arr_head != NULL)
{
ptr = *arr_head;//用if的原因:链表无节点时ptr = NULL所以没有ptr->next
while (ptr->next != NULL)
{
ptr = ptr->next;
}
ptr->next = num;
num->next = NULL;
}
else
{
num->next = NULL;
*arr_head = num;
}
}
void getInput(struct Num *num)
{
printf("请输入数字:");
scanf("%d", &num->data);
}
void printnum(struct Num *head)
{
struct Num *num;
int count = 1;
num = head;
while (num != NULL)
{
printf("num%d = %d\n", count, num->data);
num = num->next;
count++;
}
}
void release(struct Num **arr_head)//二级指针最终指向NULL
{
struct Num *temp;
while (*arr_head != NULL)
{
temp = (*arr_head)->next;
free(*arr_head);
*arr_head = temp;
/*temp = *arr_head;
*arr_head = (*arr_head)->next;
free(temp);*/
}
printf("内存已释放\n");
}
/*void release(struct Num *head)
{
struct Num *temp;
while (head != NULL)
{
temp = head->next;
free(head);
head = temp;
}
printf("内存已释放\n");
}*/
本帖最后由 一叶枫残 于 2021-2-11 17:12 编辑
问题一:因为你使用了 struct Num *temp ,然后使用temp = (*arr_head)->next,那么此时情况有两种,第一种,这个(*arr_head)->next值不为NULL,这样的话什么也不发生,但是,你随着while循环到最后一个(*arr_head)->next时值肯定为NULL,这时候就会显示这个指针未初始化了,因为NULL相当于什么值也没有。
问题二:在你这个程序,使用一级指针和二级指针都可以释放内存,但是如果你想进行赋值操作,例如把最后释放的指针赋值为NULL,这样使用一级指针是不行的,要使用二级指针才可以(这个你应该懂的吧,传入参数不能直接修改其在main里的值),然后,使用一级指针释放内存效率高(也就是速度快)。
释放内存后赋值为NULL的原因是为了防止野指针,这个网上有介绍的。
|