运行 C 中的 Valgrind 时,我收到大小为 8 的无效读取
I'm receiving Invalid read of size 8 when running Valgrind in C
我已经编写了一个 C 链表程序,并且是 运行 一个简单的测试工具,以确保所有功能都以最佳方式工作。然而,尽管没有内存泄漏,但根据 Valgrind 的说法,我的代码有两个问题,它们是
- 大小为 8 的读取无效
- 使用大小为 8 的未初始化值
任何人都可以帮助解决这个问题,因为我不确定是什么导致了这个问题。
头文件:LinkedList.h
typedef struct LinkedListNode
{
void* data;
struct LinkedListNode* next;
struct LinkedListNode* previous;
} LinkedListNode;
typedef struct
{
LinkedListNode* head;
LinkedListNode* tail;
int size;
} LinkedList;
linkedlist.c
中的removeStart函数
void* removeStart(LinkedList* list)
{
LinkedListNode* curr = list->head;
void* ptr;
if (curr->next == NULL)
{
free(curr);
list->head = NULL;
}
if (curr->next != NULL) //This is where the Invalid read of size 8 error occured
{
ptr = curr -> data;
list -> head = curr -> next;
free(curr);
curr = NULL;
list -> head -> previous = NULL;
list->size--;
}
return ptr;
}
removeLast 函数
void* removeLast(LinkedList* list)
{
LinkedListNode* curr = list -> head;
LinkedListNode* secondLast;
void* ptr;
if (isEmpty(list) == 0)
{
printf("List is empty");
}
else
{
while (curr->next != NULL)
{
secondLast = curr;
curr = curr->next;
}
if (curr == list->head)
{
list -> head = NULL;
}
}
ptr = curr->data;
list->size--;
list -> tail = secondLast;
secondLast->next = NULL; //This is where Use of uninitialised value of size 8 occured
free(curr);
curr = NULL;
return ptr;
}
在 removeStart
中,如果 curr->next == NULL
那么你释放了 curr,但在 2 行之后再次使用它。
在 removeLast
中,如果列表为空,则永远不会设置 secondLast
。
我已经编写了一个 C 链表程序,并且是 运行 一个简单的测试工具,以确保所有功能都以最佳方式工作。然而,尽管没有内存泄漏,但根据 Valgrind 的说法,我的代码有两个问题,它们是
- 大小为 8 的读取无效
- 使用大小为 8 的未初始化值 任何人都可以帮助解决这个问题,因为我不确定是什么导致了这个问题。
头文件:LinkedList.h
typedef struct LinkedListNode
{
void* data;
struct LinkedListNode* next;
struct LinkedListNode* previous;
} LinkedListNode;
typedef struct
{
LinkedListNode* head;
LinkedListNode* tail;
int size;
} LinkedList;
linkedlist.c
中的removeStart函数void* removeStart(LinkedList* list)
{
LinkedListNode* curr = list->head;
void* ptr;
if (curr->next == NULL)
{
free(curr);
list->head = NULL;
}
if (curr->next != NULL) //This is where the Invalid read of size 8 error occured
{
ptr = curr -> data;
list -> head = curr -> next;
free(curr);
curr = NULL;
list -> head -> previous = NULL;
list->size--;
}
return ptr;
}
removeLast 函数
void* removeLast(LinkedList* list)
{
LinkedListNode* curr = list -> head;
LinkedListNode* secondLast;
void* ptr;
if (isEmpty(list) == 0)
{
printf("List is empty");
}
else
{
while (curr->next != NULL)
{
secondLast = curr;
curr = curr->next;
}
if (curr == list->head)
{
list -> head = NULL;
}
}
ptr = curr->data;
list->size--;
list -> tail = secondLast;
secondLast->next = NULL; //This is where Use of uninitialised value of size 8 occured
free(curr);
curr = NULL;
return ptr;
}
在 removeStart
中,如果 curr->next == NULL
那么你释放了 curr,但在 2 行之后再次使用它。
在 removeLast
中,如果列表为空,则永远不会设置 secondLast
。