C 程序错误 - 分段错误(核心转储)

ps1234

我想练习链表,因此创建了一个可以创建链表的小程序。该程序使用 gcc 编译得很好,但是当我运行该程序时,它可以正常工作,直到 main() 中的第 13 行 (scanf("%d", &value1)) 之后它会打印错误消息 - “分段错误(核心转储)” . 我在第 13 行之后在自己的测试中添加了一个打印语句,但它没有打印出来(因此我假设问题出现在 scanf 之后,我不知道为什么)。

那么我做错了什么?

// Creates n numbers of nodes in a linked list where n is the argument 

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

#define MAX_NAME_LEN 25

typedef struct fruits {
    char *name;
    int price;
    struct fruits *next;
}fruits;

int check_format(int argc, char **argv);
fruits *create_node(char name[MAX_NAME_LEN], int value);
void print_nodes(fruits *head);

int check_format(int argc, char **argv) {

    if (argc == 2) {
        int argument = atoi(argv[1]);
        if (argument > 0) {
            return 1;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

fruits *create_node(char name[MAX_NAME_LEN], int value) {

    fruits *newNode = malloc(sizeof(fruits));
    strcpy(newNode->name, name);
    newNode->price = value;
    newNode->next = NULL;

    return newNode;
}

void print_nodes(fruits *head) {

    fruits * curr = head;
    while (curr != NULL) {
        printf("%s is %d\n", head->name, head->price);
        curr = curr->next;
    }
}

int main(int argc, char **argv) {

    int valid_format = check_format(argc, argv);

    fruits *curr = NULL;
    fruits *head = curr;
    if (valid_format) {
        int number_of_nodes;
        char fruitName[MAX_NAME_LEN] = {""};
        int value1 = 0;

        number_of_nodes = atoi(argv[1]);
        while (number_of_nodes) {

            printf("Enter the fruit name: ");
            scanf("%s", fruitName);

            printf("Enter the fruit price: ");
            scanf("%d", &value1);

            curr = create_node(fruitName, value1);
            curr = curr->next;
            number_of_nodes--;
        }
    } else {
        fprintf(stderr, "%s", "Usage: ./linked_lists [non-negative integer greater than 0]\n");
    }
    print_nodes(head);
    return 0;
}
HS

您遇到分段错误,因为您正在访问newNode->name指针而没有为其分配内存create_node()

    strcpy(newNode->name, name);

分配内存newNode->name,然后复制name到它:

newNode->name = malloc(MAX_NAME_LEN);
if (newNode->name == NULL)
    exit (EXIT_FAILURE);

strcpy(newNode->name, name);

有了这个,请确保name在释放节点之前释放分配给指针的内存

作为替代方案,可以有name作为char阵列代替结构指针fruits

typedef struct fruits {
    char name[MAX_NAME_LEN];
    ....
    .... 

有了这个,你不需要单独分配/释放内存到name.


额外的:

遵循良好的编程习惯,始终检查malloc返回:

fruits *newNode = malloc(sizeof(fruits));
if (newNode == NULL)
    exit (EXIT_FAILURE);
.....
.....

确保在完成后释放动态分配的内存。我没有看到您在打印列表节点后释放列表节点的任何位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

分段错误(核心转储)C ++-指针

来自分类Dev

分段错误(核心转储)C++

来自分类Dev

分段错误(核心转储)C

来自分类Dev

C 中的分段错误(核心转储)

来自分类Dev

如何修复C中的分段错误(核心转储)错误

来自分类Dev

分段错误:C中的核心转储错误

来自分类Dev

C编程分段错误(核心转储)错误

来自分类Dev

使用C从核心转储获取导致分段错误的地址

来自分类Dev

分段错误(核心转储)-结构和指针--C语言

来自分类Dev

分段错误(转储核心)C ++初学者

来自分类Dev

使用C从核心转储获取导致分段错误的地址

来自分类Dev

C 中的分段错误(核心转储) - 使用 PTHREADS 时

来自分类Dev

如何在C中的CPU调度仿真程序中解决分段错误(核心转储)错误?

来自分类Dev

具有动态数组的C程序中的分段错误(核心转储)错误

来自分类Dev

C程序分段默认(核心转储)

来自分类Dev

程序在c中的多行printf之后以分段错误(核心转储)结尾?

来自分类Dev

C聊天程序获取错误分段错误(核心已转储)

来自分类Dev

尝试为Struct创建内存时将分段错误核心转储到C中

来自分类Dev

使用Linux的C中的分段错误(核心转储)-特殊情况

来自分类Dev

在C中使用getchar()时出现分段错误(核心转储)?

来自分类Dev

使用动态2D数组时的C ++分段错误(核心转储)

来自分类Dev

C中的分段错误(核心转储)(带有GMP库)

来自分类Dev

分段错误:核心转储 C++ 向量对字符串:

来自分类Dev

在 C、Linux 中递归列出目录和文件时出现分段错误(核心转储)

来自分类Dev

C++ std 线程和列表分段错误(核心转储)

来自分类Dev

C ++:分段错误(核心已转储)

来自分类Dev

c中的分段错误(核心已转储)

来自分类Dev

分段错误(核心已转储)Yacc / C

来自分类Dev

分段错误(核心已转储)C lang

Related 相关文章

  1. 1

    分段错误(核心转储)C ++-指针

  2. 2

    分段错误(核心转储)C++

  3. 3

    分段错误(核心转储)C

  4. 4

    C 中的分段错误(核心转储)

  5. 5

    如何修复C中的分段错误(核心转储)错误

  6. 6

    分段错误:C中的核心转储错误

  7. 7

    C编程分段错误(核心转储)错误

  8. 8

    使用C从核心转储获取导致分段错误的地址

  9. 9

    分段错误(核心转储)-结构和指针--C语言

  10. 10

    分段错误(转储核心)C ++初学者

  11. 11

    使用C从核心转储获取导致分段错误的地址

  12. 12

    C 中的分段错误(核心转储) - 使用 PTHREADS 时

  13. 13

    如何在C中的CPU调度仿真程序中解决分段错误(核心转储)错误?

  14. 14

    具有动态数组的C程序中的分段错误(核心转储)错误

  15. 15

    C程序分段默认(核心转储)

  16. 16

    程序在c中的多行printf之后以分段错误(核心转储)结尾?

  17. 17

    C聊天程序获取错误分段错误(核心已转储)

  18. 18

    尝试为Struct创建内存时将分段错误核心转储到C中

  19. 19

    使用Linux的C中的分段错误(核心转储)-特殊情况

  20. 20

    在C中使用getchar()时出现分段错误(核心转储)?

  21. 21

    使用动态2D数组时的C ++分段错误(核心转储)

  22. 22

    C中的分段错误(核心转储)(带有GMP库)

  23. 23

    分段错误:核心转储 C++ 向量对字符串:

  24. 24

    在 C、Linux 中递归列出目录和文件时出现分段错误(核心转储)

  25. 25

    C++ std 线程和列表分段错误(核心转储)

  26. 26

    C ++:分段错误(核心已转储)

  27. 27

    c中的分段错误(核心已转储)

  28. 28

    分段错误(核心已转储)Yacc / C

  29. 29

    分段错误(核心已转储)C lang

热门标签

归档