私は長い間セグメンテーション違反に悩まされてきました。文字列へのポインタを持つ構造体を宣言しました。値を操作する create と remove の 2 つの関数を作成しました。構造体は次のとおりです。
#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 では、2 つの要素 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
誰かがこれについていくつかの提案をすることができますか? 前もって感謝します
編集:私が置いたセクションにエラーがなかったと誰かが言ったので、関連する可能性のあるすべてのコードを入れました