递归打印链接列表时出现分段错误

时间:2017-06-10 11:37:39

标签: c pointers recursion linked-list singly-linked-list

我在C中编写了一个链表,(使用gcc编译器)并试图以递归方式打印它。它告诉"分段错误",并且还仅打印第一个值。任何人都可以提出纠正它的选项..?这是我的代码。

#define MAX 10
#include <stdio.h>
#include <stdlib.h>
struct node {
    int value;
    struct node *next;
};

void printRecursively(struct node *start) {
    if (start != NULL) {
        printf("%d\n", start->value);
        start = start->next;
        printRecursively(start);
    }
}

void main() {
    struct node *nodes[MAX];
    for (int i = 0; i < MAX; i++) {
        nodes[i] = malloc(sizeof(struct node));
        nodes[i]->value = i + 1;
        nodes[i]->next = nodes[i + 1];
    }
    printRecursively(nodes[0]);
}

4 个答案:

答案 0 :(得分:6)

您的代码将每个新分配的代码的next指针初始化为未初始化的值。向后运行循环并确保将ast节点的next指针初始化为NULL

int main(void) {
    struct node *nodes[MAX];
    for (int i = MAX; i-- > 0;) {
        nodes[i] = malloc(sizeof(struct node));
        nodes[i]->value = i + 1;
        nodes[i]->next = (i == MAX - 1) ? NULL : nodes[i + 1];
    }
    printRecursively(nodes[0]);

    /* for good style, free the allocated memory */
    for (int i = 0; i < MAX; i++) {
        free(nodes[i]);
    }
    return 0;
}

正如您所指出的,有一个简单的解决方案,即增加索引值并检查内存分配失败:

int main(void) {
    struct node *nodes[MAX];
    for (int i = 0; i < MAX; i++) {
        nodes[i] = malloc(sizeof(struct node));
        if (nodes[i] == NULL) {
            fprintf(stderr, "memory allocation failure\n");
            exit(1);
        }
        nodes[i]->value = i + 1;
        nodes[i]->next = NULL;
        if (i > 0) {
            nodes[i - 1]->next = nodes[i];
        }
    }
    printRecursively(nodes[0]);

    /* for good style, free the allocated memory */
    for (int i = 0; i < MAX; i++) {
        free(nodes[i]);
    }
    return 0;
}

答案 1 :(得分:2)

您正在创建一个节点,并告诉他指向节点[i + 1],但节点[i + 1]尚未初始化,因此它将等于 nodes[i]->next = garbage

答案 2 :(得分:2)

您的代码存在三个问题。

第一个是当您创建节点时nodes[i] nodes[i+1]具有不确定的值。

因此这句话

nodes[i]->next = nodes[i + 1];
当您尝试使用数据成员next访问节点时,

会导致未定义的行为。

第二个是当索引i等于MAX-1时,循环尝试访问数组之外​​的内存。

第三个是您没有将最后一个节点的数据成员next设置为NULL

要解决这些问题,您应该使用MAX+!元素声明数组,并从数组末尾开始分配节点。

此外,您应该释放所有已分配的内存。

根据C标准,没有参数的函数main应声明为

int main( void )

程序可以按以下方式查看

#include <stdio.h>
#include <stdlib.h>

#define MAX 10

struct node
{
    int value;
    struct node *next;
};

void printRecursively( struct node *start )
{
    if ( start != NULL )
    {
        printf( "%d ", start->value );
        printRecursively( start->next );
    }
}

int main(void) 
{
    struct node * nodes[MAX + 1];

    int i = MAX;
    nodes[i] = NULL;

    for ( ; i != 0; i-- )
    {
        nodes[i-1] = malloc( sizeof( struct node ) );
        nodes[i-1]->value = i;
        nodes[i-1]->next = nodes[i];
    }

    printRecursively( nodes[0] );

    for ( i = 0; i < MAX; i++ ) free( nodes[i] );

    return 0;
}

程序输出

1 2 3 4 5 6 7 8 9 10 

答案 3 :(得分:1)

以下提议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 不执行任何未定义的行为
  4. 将评论纳入OP问题
  5. 现在,建议的代码:

    #define MAX 10
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct node
    {
        int value;
        struct node *next;
    };
    
    
    void printRecursively(struct node *start)
    {
        if (start != NULL)
        {
            printf("%d\n", start->value);
            start = start->next;
            printRecursively(start);
        }
    } // end function: printRecursively
    
    
    int main( void )
    {
        struct node *nodes[MAX] = { NULL };
    
        for (int i = 0; i < MAX; i++)
        {
            nodes[i] = malloc(sizeof(struct node));
            nodes[i]->value = i + 1;
            nodes[i]->next = NULL;
    
            if( i > 0 )
            {
                nodes[ i-1 ]->next = nodes[i];
            }
        }
    
        printRecursively(nodes[0]);
    } // end function: main
    

    以下是执行上述代码的输出:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10