C:使用指针,头文件等学习C代码

时间:2014-04-08 03:48:10

标签: c pointers segmentation-fault header-files extern

我正在尝试创建一个简单的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;

    }



}

当我一起运行所有这些程序时,我得到头部的垃圾值和分段错误错误。我的代码中有什么错误。我错过了什么?我觉得我很接近理解这些概念,但遗漏了一些重点,因为我不是 能够正确编写程序。请查找我的代码中的错误/错误以及我的理解中的错误。 三江源!

2 个答案:

答案 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',否则,即使按下回车键它也不会停止,只有当你按下任何非白色空间字符时才会停止,这将是非常糟糕的。