gpt4 book ai didi

c - 返回语句 C 上的 SegFault

转载 作者:行者123 更新时间:2023-11-30 14:58:18 25 4
gpt4 key购买 nike

我在这段代码中遇到的问题是当我尝试在第一次迭代的 addTrash 函数中返回 struct node * head 时。我怀疑这可能是堆栈损坏,但我不确定,而且我也不确切知道如何找出我给您的代码中的错误。

这是一个双向链接的链表,其唯一包含的数据具有值(value)。

struct node * modifyMainList( struct node *head, int link2Delete){

struct node * curr = head;
struct node * temp;
int i = 0;

//traverse list link2Delete amount of times
while(i != link2Delete){

curr = curr -> next;
}


//head case
if(curr -> previous == NULL){

curr = curr -> next;

head = curr;
return head;
}

//tail case
if(curr -> next == NULL){

temp = curr;
curr = curr -> previous;

curr -> next = NULL;
temp -> previous = NULL;
temp -> next = NULL;

free(temp);
return head;
}

curr -> previous -> next = curr -> next;
curr -> next -> previous = curr -> previous;


curr -> previous = NULL;
curr -> next = NULL;
free(curr);
return head;
}



struct node * addTrash(struct node *mainHead, int link2Delete){

struct node * head = NULL;
struct node * curr = mainHead;
struct node * trashCurr = NULL;;
struct node * temp = NULL;
int i = 0;

printf("im in trash before loop\n\n");
for(i = 0; i < link2Delete; i++){

curr = curr -> next;
}

printf("im in trash before head size check\n\n");
if(head == NULL){

printf("im in trash with head == null\n\n");
//head of main list
if(link2Delete == 0){

printf("im in trash link2delete == null\n\n");
curr = curr -> previous;
head = curr;

curr = curr -> next;
curr -> previous = NULL;
curr -> next = NULL;
return head;
}

printf("im in trash before tail case\n\n");
//tail of main list
if(curr -> next == NULL){


printf("im in trash with tail case\n\n");
head = curr;

head -> previous = NULL;
return head;
}

printf("im in trash before after tail case\n\n");

//every other case

//printf("this is the head value: %d\n\n", head -> value);
head = curr;
//printf("im in trash after head = curr\n\n");

head -> previous = NULL;
//printf("im in trash after head -> previous\n\n");

head -> next = NULL;
printf("im in trash after head -> next\n\n");

printf("this is the head value: %d\n\n", head -> value);
return head;

}else{

printf("im in trash inside else\n\n");
trashCurr = head;
while(trashCurr -> next != NULL){

trashCurr = trashCurr -> next;
}

if(link2Delete == 0){

temp = curr;
trashCurr -> next = temp;

temp -> previous = trashCurr;
trashCurr = temp;
trashCurr -> next = NULL;
return head;
}

//tail of main list
if(curr -> next == NULL){

temp = curr;
trashCurr = temp;

temp -> previous = trashCurr;
temp -> next = NULL;
trashCurr -> next = temp;

return head;
}

//every other case

temp = curr;
temp -> previous = trashCurr;

trashCurr -> next = temp;
trashCurr = temp;
trashCurr -> next = NULL;
return head;

}


}


void generateRandom(struct node *mainHead, int size){
int i = 0;
int link2Delete = 0;
struct node *head = NULL;
srand ( time(NULL) );
int number2Delete = rand() % size + 1;


printf("this is the rand number: %d\n", rand());

printf("this is the number of nodes to be deleted: %d\n", number2Delete);

for (i = 0; i < number2Delete; i++) {
// Pick a random node (payload) to delete.
link2Delete = (rand() % size);
printf("this is the number of nodes in the list: %d\n", size);
printf("this is the node to be deleted: %d\n", link2Delete);
size--;

if(link2Delete == 0){
mainHead = modifyMainList(mainHead, link2Delete);
//printf("this is the call return: %d\n\n", addTrash(mainHead, link2Delete) -> value);
head = addTrash (mainHead, link2Delete);

}else{

head = addTrash (mainHead, link2Delete);
mainHead = modifyMainList(mainHead, link2Delete);
}

}
return;
}

最佳答案

在您的代码中,

while(i != link2Delete){

curr = curr -> next;
}

如果 link2Delete!=0 则为无限循环。

而且,在头箱中也没有释放。

由于循环是无限的,curr = curr->next将继续重复,并且它将指向某个垃圾指针(如果循环条件为真)。然后,它具有未定义的行为。您可能会遇到 SEGFAULT。

关于c - 返回语句 C 上的 SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43405342/

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