gpt4 book ai didi

c - 链表操作(核心转储)

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

最近我一直在通过编写不同的数据结构来提高我的编程技能,而这只是一个开始!!!

现在我正在写链表,但是发生了一些恼人的事情,这个问题困扰了我很长时间,因为我不太确定这个错误,Segmentation fault(core dumped),但我知道我在内存操作上做错了。

link_list.h:

struct LINK_LIST {
char *string;
struct LINK_LIST *next;
}link_list;

==============================

link_list.c:

#include<stdio.h>
#include<stdlib.h>

int init_link_list(struct LINK_LIST *new_link) {
//char *new_string;
int i;
//new_string = (char *)malloc(sizeof(char) * STRING_SIZE);
new_link = (struct LINK_LIST *)malloc(sizeof(struct LINK_LIST));
if (new_link==NULL) {
fprintf(stderr, "Insufficient memory!!!");
return ERROR;
}
//new_link->string = new_string;
new_link->string = NULL;
//new_link->next = NULL;

return OK;
}

这里我定义了init操作,然后是insert操作:

int insert(struct LINK_LIST *link, int pos, char *in) {
int i;
if (get_length(link)>=STRING_SIZE) {
fprintf(stderr, "Link list is full!!!");
return ERROR;
}
else {
if (pos < 0 || pos-1 > get_length(link)) {
fprintf(stderr, "Invalid position");
return ERROR;
}
else {
i = 0;
do {
struct LINK_LIST *new_node;
init_link_list(new_node);
new_node->next = link->next;
link->next = new_node;
new_node->string = in;
i += 1;
} while(i<pos-1);
}
}
return OK;
}

最佳答案

你那里有一个错误:

struct LINK_LIST *new_node;
init_link_list(new_node);

init_link_list中,修改参数的值:

new_link = (struct LINK_LIST *)malloc(sizeof(struct LINK_LIST));

但是那个修改只是函数的局部;一旦你回到你的调用函数,那个改变就丢失了:

struct LINK_LIST *new_node;
init_link_list(new_node);
// Oops ! new_node's new value is lost !

您有内存泄漏(malloc 的结果丢失)并且 new_node 未初始化。当您尝试访问 *new_node 时,您会访问内存中的随机位置,因此会出现核心转储。

有一些可能的更正,最简单的是丢弃您的 OK/ERROR 返回值,如果 malloc 成功则返回一个非空指针,如果失败则返回 NULL:

struct LINK_LIST *init_link_list(void) {
struct LINK_LIST *new_link = malloc(sizeof(struct LINK_LIST));

if (new_link==NULL) {
fprintf(stderr, "Insufficient memory!!!");
return NULL;
}

new_link->next = NULL;
return new_link;
}

然后,insert 中的代码变为:

...
else {
i = 0;
do {
struct LINK_LIST *new_node = init_link_list();
// Note : here, should check whether new_node is NULL and deal with the situation
new_node->next = link->next;
link->next = new_node;
...

关于c - 链表操作(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769511/

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