(c语言)free函数释放环形链表出错,求教

jiyixiu 2019-12-29 04:28:38
程序是通过一个环形链表来加密字符串的,程序本身运行正常,但是运行到free的时候,在第二次free时出错(第一次应该是正常通过了)。
内存都是通过calloc申请的所以我觉得很奇怪。

以下为代码:

#include<stdio.h>
#include<malloc.h>
#include<string.h>

struct Link
{
char i;
Link *next;
int check;
};

Link *initRLink(int wordnum)
{
Link *Linkage;
int i;
Linkage = (Link *)calloc(wordnum, sizeof(Link));
for (i = 0; i <= (wordnum - 2); i++)
Linkage[i].next = &Linkage[i + 1];
Linkage[wordnum - 1].next = &Linkage[0];
for (i = 0; i <= (wordnum - 1); i++)
Linkage[i].check = 0;
return Linkage;
}

Link *encrypt(int code, char *list, int wordnum)
{
Link *Linkage, *head;
int i, j, k = 0;
Linkage = initRLink(wordnum);
head = Linkage;
for (i = 1; i <= wordnum; i++)
{
for (j = 1; j <= ((i == 1) ? (code - 1) : code); j++)
{
Linkage = Linkage->next;
if (Linkage->check == 1)
j--;
}
Linkage->i = list[k];
Linkage->check = 1;
k++;
}
return head;
}

void outLink(Link *Linkage, int wordnum)
{
int i;
for (i = 0; i <= (wordnum - 2); i++)
{
printf("%c", Linkage->i);
Linkage = Linkage->next;
}
printf("%c", Linkage->i);
}

void freeLink(Link *Linkage, int wordnum)
{
int i;
Link *temp;
temp = Linkage;
for (i = 1; i <= (wordnum - 1); i++)
{
temp = Linkage;
Linkage = Linkage->next;//这里运行第二次的时候出错
free(temp);
}
free(Linkage);
}

int main()
{
char inp[100];
int code, wordnum;
Link *fp;
printf("请输入原文字符串:\n");
gets(inp);
printf("请输入整数加密钥匙:\n");
scanf("%d", &code);
//这个code不能越界
printf("密文字符串为:\n");
wordnum = strlen(inp);
fp = encrypt(code, inp, wordnum);
outLink(fp, wordnum);
freeLink(fp, wordnum);
return 0;
}
...全文
148 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiyixiu 2019-12-30
  • 打赏
  • 举报
回复
引用 3 楼 coo135 的回复:
[quote=引用 2 楼 jiyixiu 的回复:]
[quote=引用 1 楼 coo135 的回复:]
好奇怪的做法,明明是数组还得假装是链表~~~

你用Linkage = (Link *)calloc(wordnum, sizeof(Link));一次性申请了内存,free(Linkage);一次就全部还完了啊。再次free不是你的内存,当然出错。


我以前也用calloc申请内存的啊,那个时候是单链表,我就一个一个free没出过问题。。。虽然我申请了wordnum个但是我fp的指针是指向Linkage[0]的,不是Linkage整个块啊。。。如果指向整个块的话不就会出现**和*型不匹配问题了吗[/quote]

申请一次释放一次,申请多次释放多次。一个malloc对应一个free,同理一个calloc对应一个free,你现在是一个calloc对应多个free。[/quote]

行吧,我也不知道我之前calloc申请的单链表释放多次怎么可以正常执行的……
coo135 2019-12-29
  • 打赏
  • 举报
回复
引用 2 楼 jiyixiu 的回复:
[quote=引用 1 楼 coo135 的回复:]
好奇怪的做法,明明是数组还得假装是链表~~~

你用Linkage = (Link *)calloc(wordnum, sizeof(Link));一次性申请了内存,free(Linkage);一次就全部还完了啊。再次free不是你的内存,当然出错。


我以前也用calloc申请内存的啊,那个时候是单链表,我就一个一个free没出过问题。。。虽然我申请了wordnum个但是我fp的指针是指向Linkage[0]的,不是Linkage整个块啊。。。如果指向整个块的话不就会出现**和*型不匹配问题了吗[/quote]

申请一次释放一次,申请多次释放多次。一个malloc对应一个free,同理一个calloc对应一个free,你现在是一个calloc对应多个free。
jiyixiu 2019-12-29
  • 打赏
  • 举报
回复
引用 1 楼 coo135 的回复:
好奇怪的做法,明明是数组还得假装是链表~~~

你用Linkage = (Link *)calloc(wordnum, sizeof(Link));一次性申请了内存,free(Linkage);一次就全部还完了啊。再次free不是你的内存,当然出错。


我以前也用calloc申请内存的啊,那个时候是单链表,我就一个一个free没出过问题。。。虽然我申请了wordnum个但是我fp的指针是指向Linkage[0]的,不是Linkage整个块啊。。。如果指向整个块的话不就会出现**和*型不匹配问题了吗
coo135 2019-12-29
  • 打赏
  • 举报
回复
好奇怪的做法,明明是数组还得假装是链表~~~

你用Linkage = (Link *)calloc(wordnum, sizeof(Link));一次性申请了内存,free(Linkage);一次就全部还完了啊。再次free不是你的内存,当然出错。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧