Code Bye

继续命,free之后求链表长度

Linux环境建立链表之后free,再求长度的时候显示的依旧是原本长度。而且valgrind显示正常free,但有调用错误。
用二级指针可以解决但boss就是不让用……
valgrind 显示
Invalid read of size 8
Address 0x51fc050 is 16 bytes inside a block of size 24 free”d
//函数结构体
typedef struct Link_node
{
char *Key;
void *value;
struct Link_node *next;
} *Link_t;
//新建链表
Link_t LinkTable_new(void)
{
Link_t start;
if ((start=(Link_t)malloc(sizeof(struct Link_node))) != NULL )
{
start->Key = NULL;
start->value = NULL;
start->next = NULL;
return start;
}
else
{
printf(“malloc is fail\n”);
return NULL;
}
}
//删除链表
void LinkTable_free(Link_t oLink)
{
if (oLink == NULL)
{
printf(“The linked list isn”t existence\n”);
return;
}
Link_t p, q;
p = oLink;
if (p->next == NULL) {
free(p->Key);
p->Key = NULL;
p->value = NULL;
free(p);
oLink = NULL;
return ;
}
while (p != NULL){
q = p->next;
free(p->Key);
p->Key = NULL;
p->value = NULL;
free(p);
p = q;
}
oLink = NULL;
}
//求长度
int LinkTable_getLength(Link_t oLink)
{
if (oLink == NULL )
{
printf(“The linked list isn”t existence\n”);
return 0;
}
else
{
int LinkTable_length = 1;
Link_t count_point;
count_point = oLink;
while(count_point->next != NULL)
{
count_point = count_point->next;
LinkTable_length += 1;
}
return LinkTable_length;
}
}
//主函数
int main(int argc, char const *argv[])
{
Link_t head_point;
int x;
head_point = LinkTable_new();
LinkTable_free(head_point);
x = LinkTable_getLength(head_point);
printf(“%d\n”, x);
return 0;
}
到底哪有问题呢…………
解决方案

30

你在LinkTable_free中最后oLink = NULL; 并没有修改到主函数中的head_point参数,而只是将临时参数对象设置为NULL而已
所以你之后在主函数中再调用LinkTable_getLength(head_point)时,head_point的值并不是NULL,你只是把指针指向的内存释放了,但指针仍指向那块内存

50

或你应该设计成带头结点的链表(头结点不要放数据)
LinkTable_free函数里仅仅需要把有数据的结点都free掉,头结点等到程序结束前在主函数free

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明继续命,free之后求链表长度