【发布时间】:2018-11-10 16:49:34
【问题描述】:
我有一个 valgrind 的探针给我一个错误,说“访问不在地址 0x8 的映射区域内”。然后它说“在 0x400606: append_linked_list (testing2.c:64) by 0x400563: main (testing2.c:32)”。第 64 行是list->tail->next = newNode;,第 32 行只是调用第 64 行在append_linked_list(list, (void *) argv[i]); 中的函数。当我运行程序时,我只是将其运行为“./testing 这是一个相当短的测试字符串。”。有谁知道为什么 valgrind 给我这个错误?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct Node
{
void *data;
struct Node *next;
struct Node *prev;
} Node;
typedef struct LinkedList
{
Node *head;
Node *tail;
} LinkedList;
Node *initialise_node(void);
LinkedList *initialise_linked_list(void);
Node *append_linked_list(LinkedList *list, void *data);
int main(int argc, char **argv)
{
LinkedList *list;
int i;
list = initialise_linked_list();
for(i = 1; i < argc; i++)
{
append_linked_list(list, (void *) argv[i]);
}
return 0;
}
Node *initialise_node(void)
{
Node *node;
node = (Node *) malloc(sizeof(Node));
return node;
}
LinkedList *initialise_linked_list(void)
{
LinkedList *list;
list = (LinkedList *) malloc(sizeof(LinkedList));
list->head = NULL;
list->tail = NULL;
return list;
}
Node *append_linked_list(LinkedList *list, void *data)
{
Node *newNode = initialise_node();
newNode->data = data;
newNode->prev = list->tail;
list->tail->next = newNode;
newNode->next = NULL;
return newNode;
}
【问题讨论】:
-
地址
0x8低得可疑。仅从 Valgrind 消息的那一部分来看,该程序似乎正在取消引用无效指针。 -
你已经初始化了
list->tail = NULL;并且你正在尝试取消引用它list->tail->next = newNode;你可能需要学习如何使用tail在末尾插入节点。append_linked_list中缺少大量代码。