gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:05 26 4
gpt4 key购买 nike

我想练习链表,因此创建了一个可以创建链表的小程序。该程序使用 gcc 编译得很好,但是当我运行该程序时,它在 main() (scanf("%d", &value1)) 中的第 13 行之前工作正常,之后它打印错误消息 - “段错误(核心转储)” .我在第 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;
}

最佳答案

您遇到段错误是因为您在访问 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);
.....
.....

确保在使用完后释放动态分配的内存。我没有看到您在打印列表节点后释放列表节点的地方。

关于C 程序错误 - 段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727909/

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