我想练习链表,因此创建了一个小程序来创建链表。该程序可以使用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;
}
答案 0 :(得分:1)
由于您正在访问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);
.....
.....
完成后,请确保释放动态分配的内存。在打印列表节点后,我看不到要释放它们的任何位置。
答案 1 :(得分:1)
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;
}
在这里,您为结构分配内存,但没有为名称分配内存。您必须为名称分配内存,或者将类型从指针更改为固定大小的数组:
typedef struct fruits
{
char name[MAX_NAME_LEN];
int price;
struct fruits *next;
}fruits;