我正在尝试创建一个简单的C程序,同时了解有关指针,链表和头文件的概念。 我想通过将所有这些概念结合在一起来创建一个简单的C程序,以便更好地理解。 我的代码及其解释如下:
我有一个标题文件" header1.h"我已经声明了在各种源文件和" head"之间共享的结构。链表的变量。 头文件如下:
那么header1.h
struct node{
char * name;
struct node* next;
};
extern struct node* head;
现在,我有一个名为" start_prog.c"的主要源文件。已经得到了#34;主要"功能 以及控制程序执行的菜单。 菜单有各种选项,如添加元素,删除元素,反向列表等(为简单起见,我只提供两个选项,即最重要的插入和打印列表)。
来自start_prog.c的我打电话给"创建"将元素添加到列表的函数。 如果列表不存在,那么它将创建一个else它将元素追加到最后一个元素之后的列表中。 create函数在另一个源文件" create.c"。
中定义两个文件如下:
start_prog.c:
#include<stdio.h>
#include<stdlib.h>
#include "header1.h" //include the header file
struct node* head = NULL; //Define the external variable head to be null initially
struct node* create();
void main(void){
int option;
do{
printf("\nplease select the option : \n\t\t1)add element \n\t\t2)Print List\n");
scanf("\n%d",&option);
switch(option){
case 1:
head = create();
break;
case 2:
print_list();
break;
}
}while(option != 3);
}
和create.c文件如下:
#include<stdio.h>
#include<stdlib.h>
#include "header1.h"
//this function creates the linked list if the list is null or inserts the
//element at the end of the list.
struct node* create() {
if(head == NULL){
//create a new list and return head.
printf("\nhead is null\n");
struct node* newnode = (struct node*)malloc(sizeof(struct node));
char * new_name;
printf("\nplease enter the new name\n ");
scanf("%s\n", new_name);
newnode -> name = new_name;
newnode -> next = NULL;
head = newnode;
return head;
}
else if(head != NULL){
printf("\nhead is not null\n ");
struct node* newnode = (struct node*)malloc(sizeof(struct node));
char * new_name;
printf("\n Please Enter the new name \n");
scanf("%s\n", new_name);
newnode -> name = new_name;
newnode -> next = NULL;
struct node* ptr = NULL;
ptr = head;
while((ptr -> next) != NULL){
ptr = ptr -> next;
}
ptr -> next = newnode;
return head;
}
}
当我一起运行所有这些程序时,我得到头部的垃圾值和分段错误错误。我的代码中有什么错误。我错过了什么?我觉得我很接近理解这些概念,但遗漏了一些重点,因为我不是 能够正确编写程序。请查找我的代码中的错误/错误以及我的理解中的错误。 三江源!
答案 0 :(得分:2)
通常,当您尝试访问或向内存分配未分配给该进程的值时,会发生分段错误。
通常检查您要分配值的位置或检索它是否已分配给它。
一个人认为我认为是char * new_name; // declaring the pointer
printf("\n Please Enter the new name \n");
scanf("%s\n", new_name);//reading the value from stdin to where pointer is pointing
当你声明指针填充垃圾值时。这可能超出了您的进程分配的内存范围。并且你要求你的编译器将值存储在那里是非法的,因此内核会引发SIGSEGV信号并停止你的进程。
在分配值
之前分配内存new_name = malloc(20); //您认为需要多少
答案 1 :(得分:1)
在你的create.c文件中
char * new_name;
printf("\nplease enter the new name\n ");
scanf("%s\n", new_name);
上面的代码将如何执行,请尝试使用数组临时存储名称。
如果你想在那里使用指针那么你也必须为那个poiner分配memrory。
并且不要在scanf中使用'\n'
,否则,即使按下回车键它也不会停止,只有当你按下任何非白色空间字符时才会停止,这将是非常糟糕的。