为什么销毁顺序表后,还是不空呢
#include<stdlib.h>#include<malloc.h>
#include<stdio.h>
#define MaxSize100
//设置静态分配顺序结构
typedef int ElemType;
typedef struct
{
ElemType data;
int length;
}SqList;
//建立顺序表
//1.初始化线性表
void InitList(SqList *&L)
{
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
}
bool ListInsert(SqList *&L, int i, ElemType e)
{
int j;
if (i<1 || i>L->length + 1)
return false;
i--;
for (j = L->length; j > i; j--)
L->data = L->data;
L->data = e;
L->length++;
return true;
}
bool ListDelete(SqList *&L, int i, ElemType &e)
{
int j;
if (i<1 || i>L->length)
return false;
i--;
e = L->data;
for (j = i; j < L->length - 1; j++)
L->data = L->data;
L->length--;
return true;
}
//7.判断是否为空表
bool ListEmpty(SqList *L)
{
return (L->length == 0);
}
//8.输出线性表
void DispList(SqList *L)
{
for (int i = 0; i < L->length; i++)
printf("%d ", L->data);
printf("\n");
}
//9.销毁线性表
void DestroyList(SqList *&L)
{
free(L);
}
int main()
{
SqList *h;
int i,e;
InitList(h);
printf("输入需要插入的位置:");
scanf("%d", &i);
printf("\n输入所插入的元素:");
scanf("%d", &e);
ListInsert(h, i, e);
printf("输入需要插入的位置:");
scanf("%d", &i);
printf("\n输入所插入的元素:");
scanf("%d", &e);
ListInsert(h, i, e);
printf("输入需要插入的位置:");
scanf("%d", &i);
printf("\n输入所插入的元素:");
scanf("%d", &e);
ListInsert(h, i, e);
printf("H:");
DispList(h);
printf("%d\n",ListEmpty(h));
DestroyList(h);
printf("H:");
DispList(h);
return 0;
}
在销毁顺序表后,指针h指向的内存空间已经被释放,但h指针本身的值并没有改变,仍然指向之前的内存空间,所以h不为空,但是已经不能再对其进行操作,否则会出现不可预测的错误。为了避免这种情况,可以在销毁顺序表后将h指针赋值为NULL,即h=NULL。 歌者文明清理员 发表于 2023-3-29 16:56
在销毁顺序表后,指针h指向的内存空间已经被释放,但h指针本身的值并没有改变,仍然指向之前的内存空间,所 ...
谢谢你的回复
那指针本身的值是不是系统自动分配的随机值呢? sunchaoee 发表于 2023-3-30 13:58
谢谢你的回复
那指针本身的值是不是系统自动分配的随机值呢?
malloc,和free是相对的。
假设int* h,他本来是随机值,malloc了一个内存空间,意思是你告诉电脑,这里这块内存我用了,然后把h不知道指向什么地方的指针,挪动到了这个开辟好的内存段上。你用free(h),释放的是h指向的这块空间,意思是,告诉电脑,这块内存我不要了,你可以放垃圾了,但是h的值已经被赋予(指向那个位置没动),你要让h不再是个指向这个位置的指针,就只能让 h=NULL; 。
int*arr = (int*)malloc(sizeof(int)*3);
arr = {1,2,3};
free(arr);
此时就相当于 arr = {-849237123,-830557264,-455723623,-598347279………………………………}
找不到极限了,因为它指向的内存不受程序控制了。
arr这个指针不置空,就相当于你把它指向内存段,事后内存不归他管了,你却还让他指向那里,没把它挪走。
即使程序结束会自动释放堆区,我们也应该及时的释放和置空,不管置空有无意义,不用的指针置空总没错。顶多多写几个代码而已,防止内存泄漏。 Filthy-ice 发表于 2023-4-21 22:46
malloc,和free是相对的。
假设int* h,他本来是随机值,malloc了一个内存空间,意思是你告诉电脑,这 ...
指针的值也不是随机值,可能我们不知道是什么,但是电脑分配时,把开辟内存的信息以二进制码存储在指针的
值 里,但肯定不是随机值。这个值应该包括了内存段的位置、大小、元素等信息。不是随机的。 sunchaoee 发表于 2023-3-30 13:58
谢谢你的回复
那指针本身的值是不是系统自动分配的随机值呢?
当然,你没把它指向空间的时候,他就是一个野指针,你打印地址就属于越界访问了。
页:
[1]