我正在尝试创建一个链表数据库,但由于某种原因,程序不允许我访问内存,或者至少调试器是这么说的。我使用的是gdb调试器,代码块。
我已经在另一台机器上用相同的操作系统(windows)编译了这个程序。它工作得很完美,但是调试器显示了同样的错误。
void print_ListEl(ListEl* head)
{
ListEl* current = malloc(sizeof(ListEl));
current = head;
if (head==NULL) exit(EXIT_FAILURE);
if (current->next==NULL)
{
puts("No elements");
return;
}
else
{
int i=1;
while(current->next!=NULL)
{
printf("%d.%sn", i, current->name);
current=current->next;
++i;
}
}
free(current);
}
它是这样使用的:
ListEl* element = malloc(sizeof(ListEl));
print_listEl(element);
根据调试器的说法,这似乎是导致问题的函数。当我观察"current->next"变量时,调试器会说"无法访问地址处的内存"。如果我将current->next更改为current,调试器仍然显示与导致问题相同的函数。ListEl结构只是一个具有char类型数据的常规单链列表。
struct ListEl
{
char name[MAX_CHAR];
struct ListEl* next;
};
我也使用
typedef struct ListEl ListEl
使用ifndef和endifHeader是安全的,并且都包括在内,我已经检查过了。
当列表中没有元素时,这个函数不会放"没有元素",而是会喷出一些随机字符并使程序崩溃。
可能是
ListEl* current = malloc(sizeof(ListEl));
current = head;
必须是
ListEl* current = malloc(sizeof(ListEl));
head = current;
否则为什么要做malloc并立即丢失它?
我希望你在之前有额外的代码
if (current->next==NULL)
因为电流只是分配的,而不是初始化的
当我观察"current->next"变量时,调试器会说"无法访问地址处的内存">
这意味着当前已损坏,因为例如它已被删除,或者您从未初始化字段下一个。问题是你没有给出最小、完整和可验证的示例
如果你的代码真的是:
ListEl* element = malloc(sizeof(ListEl));
print_listEl(element);
element->name和element->next都未初始化,因此在print_listEl
中它是相同的
-
对于
current
,不应该使用malloc
。您将立即用head
替换从中获得的指针,并释放分配。稍后的free
将释放列表的最后一个元素,但不会将前一个元素的指针设置为NULL
,如果稍后使用该列表,则会导致未定义的行为。 -
您在这里为节点分配内存:
ListEl* element = malloc(sizeof(ListEl));
但在调用
print_listEl(element);
之前,您从未设置过它的任何值。因此指针CCD_ 8将是不确定的,并且与CCD_。稍后在print_listEl
中取消引用此指针,导致未定义的行为。始终在malloc
:之后初始化ListEl* element = malloc(sizeof(ListEl)); element->next = NULL; memset(element->name, ' ', sizeof(element->name));