gpt4 book ai didi

c - 在 Struct - C 中释放字符串时出现段错误

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

我长期以来一直陷入段错误。我声明了一个带有指向字符串的指针的结构。我写了两个函数,create 和 remove 来操作值。结构如下:

#include "filename.h"  
//*in filename.h:* typedef struct linkNode linkNode_t;

struct linkNode{
struct linkNode *next;
char *value;
};

create函数会先为节点分配内存,然后为值分配内存,然后将输入的值复制到值字段中:

linkNode_t* create(char* stuff){
linkNode_t *ptr=malloc(sizeof(linkNode_t));
if(ptr==NULL){
printf("malloc failure");
return NULL;
}
char* tempvalu=malloc(sizeof(char)*strlen(stuff)+1);
if(tempvalu==NULL){
printf("malloc failure");
return NULL;
}
strcpy(tempvalu,stuff);
ptr->next=NULL;
ptr->value=tempvalu;
return ptr;
}

一个函数用于向链表中插入一个节点:

linkNode_t* insertLast(linkNode_t* start, linkNode_t* newNode){
linkNode_t* current=start;
while(current->next!=NULL){
current=current->next;
}
//now current points to the last element in the linked list
current->next=newNode;
return start;
}

引起我问题的部分如下:

linkNode_t* removebyValue(linkNode_t* start, char* valu){
/**removes the first instance of a node with a certain value. Return *start after removing.
if linked list becomes empty, return NULL*/

linkNode_t *current=start;
linkNode_t *previous=start;
while(current!=NULL){
if(strcmp(valu,current->value)==0) {//found the node to delete
if(current==start){//removing the head
linkNode_t* retvalue= current->next;
free(current->value);
free(current);
return retvalue;
}
else{ //removing other elements in the linked list
previous->next=current->next;
free(current->value);
free(current);
return start;
}
}
else{
previous=current;
current=current->next;
}
}
return start;
}

在 Main 中,我创建了一个包含两个元素 1 和 2 的链表,并在发生段错误时尝试释放元素 1。

int main(){
linkNode_t *pt1=create("1");
pt1=insertLast(pt1,create("2"));
removebyValue(pt1,"1"); //Causes seg fault. If I replace "1" by "2" nothing happens

有人可以对此提出一些建议吗?提前致谢

编辑:我放了所有可能相关的代码,因为有人说我放的部分没有错误

最佳答案

我认为您在正确维护起始指针的同时删除节点的想法太多了。考虑一种有希望的更简单的方法。

typedef struct node_t 
{
struct node_t* next;
char* value;
} node_t;

node_t* remove(node_t *start, const char* valu)
{
node_t* current=start;
node_t* prev=NULL;

while(current && strcmp(current->value, valu))
{
prev = current;
current = current->next;
}

if (current)
{
if (prev) // we're not deleting start node
prev->next = current->next;

else // we *are* deleting start node
start = current->next;

// now the node is unlinked. remove it.
free(current->value);
free(current);
}
return start;
}

关于c - 在 Struct - C 中释放字符串时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553456/

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