鱼C论坛

 找回密码
 立即注册
查看: 544|回复: 5

[已解决]为什么销毁顺序表后,还是不空呢

[复制链接]
发表于 2023-3-29 12:31:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdlib.h>
  2. #include<malloc.h>
  3. #include<stdio.h>
  4. #define MaxSize  100
  5. //设置静态分配顺序结构
  6. typedef int ElemType;
  7. typedef struct
  8. {
  9.         ElemType data[MaxSize];
  10.         int length;
  11. }SqList;
  12. //建立顺序表

  13. //1.初始化线性表
  14. void InitList(SqList *&L)
  15. {
  16.         L = (SqList*)malloc(sizeof(SqList));
  17.         L->length = 0;
  18. }
  19. bool ListInsert(SqList *&L, int i, ElemType e)
  20. {
  21.         int j;
  22.         if (i<1 || i>L->length + 1)
  23.                 return false;
  24.         i--;
  25.         for (j = L->length; j > i; j--)
  26.                 L->data[j] = L->data[j - 1];
  27.         L->data[i] = e;
  28.         L->length++;
  29.         return true;
  30. }
  31. bool ListDelete(SqList *&L, int i, ElemType &e)
  32. {
  33.         int j;
  34.         if (i<1 || i>L->length)
  35.                 return false;
  36.         i--;
  37.         e = L->data[i];
  38.         for (j = i; j < L->length - 1; j++)
  39.                 L->data[j] = L->data[j + 1];
  40.         L->length--;
  41.         return true;
  42. }
  43. //7.判断是否为空表
  44. bool ListEmpty(SqList *L)
  45. {
  46.         return (L->length == 0);
  47. }
  48. //8.输出线性表
  49. void DispList(SqList *L)
  50. {
  51.         for (int i = 0; i < L->length; i++)
  52.                 printf("%d ", L->data[i]);
  53.         printf("\n");
  54. }
  55. //9.销毁线性表
  56. void DestroyList(SqList *&L)
  57. {
  58.         free(L);
  59. }
  60. int main()
  61. {
  62.         SqList *h;
  63.         int i,e;
  64.         InitList(h);
  65.         printf("输入需要插入的位置:");
  66.         scanf("%d", &i);
  67.         printf("\n输入所插入的元素:");
  68.         scanf("%d", &e);
  69.         ListInsert(h, i, e);
  70.         printf("输入需要插入的位置:");
  71.         scanf("%d", &i);
  72.         printf("\n输入所插入的元素:");
  73.         scanf("%d", &e);
  74.         ListInsert(h, i, e);
  75.         printf("输入需要插入的位置:");
  76.         scanf("%d", &i);
  77.         printf("\n输入所插入的元素:");
  78.         scanf("%d", &e);
  79.         ListInsert(h, i, e);
  80.         printf("H:");
  81.         DispList(h);
  82.         printf("%d\n",ListEmpty(h));
  83.         DestroyList(h);
  84.         printf("H:");
  85.         DispList(h);
  86.         return 0;
  87. }
复制代码

最佳答案
2023-4-21 22:46:46
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这个指针不置空,就相当于你把它指向内存段,事后内存不归他管了,你却还让他指向那里,没把它挪走。
即使程序结束会自动释放堆区,我们也应该及时的释放和置空,不管置空有无意义,不用的指针置空总没错。顶多多写几个代码而已,防止内存泄漏。
QQ图片20230329123007.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-29 16:56:04 | 显示全部楼层
在销毁顺序表后,指针h指向的内存空间已经被释放,但h指针本身的值并没有改变,仍然指向之前的内存空间,所以h不为空,但是已经不能再对其进行操作,否则会出现不可预测的错误。为了避免这种情况,可以在销毁顺序表后将h指针赋值为NULL,即h=NULL。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-30 13:58:35 | 显示全部楼层
歌者文明清理员 发表于 2023-3-29 16:56
在销毁顺序表后,指针h指向的内存空间已经被释放,但h指针本身的值并没有改变,仍然指向之前的内存空间,所 ...

谢谢你的回复
那指针本身的值是不是系统自动分配的随机值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 22:46:46 | 显示全部楼层    本楼为最佳答案   
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这个指针不置空,就相当于你把它指向内存段,事后内存不归他管了,你却还让他指向那里,没把它挪走。
即使程序结束会自动释放堆区,我们也应该及时的释放和置空,不管置空有无意义,不用的指针置空总没错。顶多多写几个代码而已,防止内存泄漏。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 22:51:04 | 显示全部楼层
Filthy-ice 发表于 2023-4-21 22:46
malloc,和free是相对的。
假设int* h,他本来是随机值,malloc了一个内存空间,意思是  你告诉电脑,这 ...

指针的值也不是随机值,可能我们不知道是什么,但是电脑分配时,把开辟内存的信息以二进制码存储在指针的
    值    里,但肯定不是随机值。这个值应该包括了内存段的位置、大小、元素等信息。不是随机的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 22:52:39 | 显示全部楼层
sunchaoee 发表于 2023-3-30 13:58
谢谢你的回复
那指针本身的值是不是系统自动分配的随机值呢?

当然,你没把它指向空间的时候,他就是一个野指针,你打印地址就属于越界访问了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 05:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表