c - 返回语句 C 上的 SegFault

标签 c segmentation-fault return stack-corruption

我在这段代码中遇到的问题是当我尝试在第一次迭代的 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/

相关文章:

c - 字符串、字符数组大小和 calloc --- 是什么导致了这个段错误?

c - 如何正确使用 memcpy 而不会出现段错误?

java - Try , finally 执行流程当 return 在 try block 中

c - 当有多个 fork 进程在运行时,我无法理解流程

html - 使用 C 的 HTTP 响应中的图像?

c - 为什么我会遇到段错误?

使用 try catch 的 Java 异常处理

java - 为什么我的返回声明没有被识别?

c++ - i = 0,++i 定义了吗?

c - 从 8 位到 32 位的位复制