为什么这个 C 程序不允许我访问内存?



我正在尝试创建一个链表数据库,但由于某种原因,程序不允许我访问内存,或者至少调试器是这么说的。我使用的是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

使用ifndefendifHeader是安全的,并且都包括在内,我已经检查过了。

当列表中没有元素时,这个函数不会放"没有元素",而是会喷出一些随机字符并使程序崩溃。

可能是

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->nameelement->next都未初始化,因此在print_listEl中它是相同的

  1. 对于current,不应该使用malloc。您将立即用head替换从中获得的指针,并释放分配。稍后的free将释放列表的最后一个元素,但不会将前一个元素的指针设置为NULL,如果稍后使用该列表,则会导致未定义的行为。

  2. 您在这里为节点分配内存:

    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));
    

相关内容

  • 没有找到相关文章

最新更新