簡體   English   中英

當我嘗試使用遞歸打印結構時,為什么會出現分段錯誤(核心已轉儲)?

[英]Why am i getting Segmentation fault (core dumped) when i try to print a struct using recursion?

我是 C 的新手。我正在嘗試制作具有以下結構的鏈表。

struct ListNode {
    int val;
    struct ListNode *next;
};

所以我使用遞歸從給定數組創建鏈表。

struct ListNode makeNode(int val, struct ListNode* l){
    struct ListNode node;
    node.val = val;
    node.next = l;
    return node;
}

struct ListNode makeNodeFromList(int arr[], int length, int index){

    // Checks if the given index is the last element of the array
    // (Base Condition)
    if ((length-1) == index){
        return makeNode(arr[index], NULL);
    }

    struct ListNode next;
    next = makeNodeFromList(arr, length, index+1);
    return makeNode(arr[index],&next);

}

但是,當我嘗試使用以下代碼打印結果時,它會不斷打印第二個元素,並且出現Segmentation fault (core dumped)錯誤。

void printNode(struct ListNode *l){
    // Prints the each value of the struct, separated by tab.
    

    if ((l->next) != NULL){
        printf("%d\t",(l->val));
        printNode((l->next));
    }
    else{
        printf("%d\n",(l->val));
    }
}

int main() { 
    int arr[3] = {1,2,3};
    struct ListNode item;
    item = makeNodeFromList(arr,3,0);
    printNode(&item);
    }

*-編輯

整個代碼而不是片段。

#include <stdio.h>
#include <stdlib.h>
struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode makeNode(int val, struct ListNode* l){
    struct ListNode node;
    node.val = val;
    node.next = l;
    return node;
}

struct ListNode makeNodeFromList(int arr[], int length, int index){
    printf("%d\t", arr[index]);

    // Checks if the given index is the last element of the array.
    if ((length-1) == index){
        return makeNode(arr[index], NULL);
    }

    struct ListNode next;
    next = makeNodeFromList(arr, length, index+1);
    return makeNode(arr[index],&next);

}

void printNode(struct ListNode *l){
    // Prints the each value of the struct, separated by tab.
    

    if ((l->next) != NULL){
        printf("%d\t",(l->val));
        printNode((l->next));
    }
    else{
        printf("%d\n",(l->val));
    }
}

int main() { 
    int arr[3] = {1,2,3};
    struct ListNode item;
    item = makeNodeFromList(arr,3,0);
    printNode(&item);

    }

我無法弄清楚我犯的錯誤。

我試圖找到類似的問題,但找不到類似的案例。

在 gdb 下運行你的程序,我發現你的程序在printf("%d\t",(l->val)); . 無法訪問變量l->next 正如@Someprogrammerdude 在上面告訴您的那樣,這是因為它是makeNodeFromList()中的next一個局部變量,返回時不在 scope 中。

最小的修復是(你需要一個免費的匹配):

#include <string.h>

struct ListNode makeNodeFromList(int arr[], int length, int index){
    if ((length-1) == index) {
        return makeNode(arr[index], NULL);
    }
    struct ListNode next = makeNodeFromList(arr, length, index+1);
    struct ListNode *p = malloc(sizeof(next));
    memcpy(p, &next, sizeof(next));
    return makeNode(arr[index], p);
}

另外,您的printNode()對我來說不合適。 試試這個:

void printNode(struct ListNode *l) {
    if(!l) return;
    printf("%d\t", l->val);
    printNode(l->next);
}

這是makeNodeFromList()的簡化版本:

void makeNodeFromList(int length, int arr[length], struct ListNode nodes[length]){
    for(size_t i = 0; i < length; i++) {
        nodes[i].val = arr[i];
        nodes[i].next = i + 1 < length ? &nodes[i + 1] : NULL;
    }
}

int main() {
    int arr[] = {1,2,3};
    struct ListNode nodes[sizeof arr / sizeof *arr];
    makeNodeFromList(sizeof arr / sizeof *arr, arr, nodes);
    printNode(nodes);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM