gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:09 25 4
gpt4 key购买 nike

我正在尝试创建一个链接列表数据库,但出于某种原因,程序不允许我访问内存,或者至少调试器是这么说的。我正在使用 gdb 调试器,codeblocks。

我已经在另一台机器上用相同的操作系统 (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.%s\n", 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

header 对于 ifndefendif 是安全的,并且都包含在内,我已经检查过了。

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

最佳答案

可能是

ListEl* current = malloc(sizeof(ListEl));
current = head;

必须是

ListEl* current = malloc(sizeof(ListEl));
head = current;

否则为什么执行 malloc 并立即丢失它?


我希望你之前有额外的代码

if (current->next==NULL)

因为current只是分配,没有初始化


当我查看“current->next”变量时,调试器显示“无法在地址访问内存”。

这意味着 current 已损坏,因为例如它已被删除,或者您从未初始化字段 next。问题是你不给 Minimal, Complete, and Verifiable example

如果你的代码真的是这样的:

ListEl* element = malloc(sizeof(ListEl));
print_listEl(element);

element->nameelement->next 都没有初始化,所以在 print_listEl 中是一样的

关于c - 为什么这个 C 程序不允许我访问内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com