C语言分段故障(堆芯)



我在我的代码中得到一个分段错误,它在单链表中插入数据,然后打印相同的。我完全不知道它是从哪里来的。这是我的代码。欢迎提出任何建议或建议。谢谢。

#include<stdio.h>
#include<stdlib.h>
void insert_data(int data);
void print_list();
typedef struct node{
    int info;
    struct node* next;
    }mynode; 
mynode *head=NULL,*tail=NULL,*ptr = NULL;
int main()
{
        int nodes,i;
    int data;
    printf("how many nodes u want to insert");
    scanf("%d",&nodes);
    for(i=0;i<nodes;i++)
    {
        printf("Enter data");
        scanf("%d",&data);
        insert_data(data);
    }
    print_list();
    return 0;
}
void insert_data(int data)
{
    ptr = (mynode *)malloc(sizeof(mynode));
    (*ptr).info = data;
    if(head == NULL)
    {
    (*ptr).next = NULL;
    head = ptr;
    tail = ptr;
    }
    else
    {
        printf("inside else");
        (*ptr).next=NULL;
        (*tail).next = ptr;
        tail = ptr;
    }
    return;
}
void print_list()
{   
    ptr = head;
    while((*ptr).next != NULL)
    {
        printf("%d",(*ptr).info);
        ptr = (*ptr).next;
    }   
    printf("%d",(*ptr).info);
}

if(head=NULL)应为if(head==NULL)

此外,通常不鼓励使用过多的全局变量。可以在每个函数中将ptr声明为一个局部变量。这样做可以防止函数之间奇怪的交互。

例如:

void print_list()
{   
  mynode* ptr2 = head; // ptr2 is local : it only exist in this function.
  while((*ptr2).next != NULL)
  {
    printf("%d",(*ptr2).info);
    ptr2 = (*ptr2).next;
  }   
  printf("%d",(*ptr2).info);
}

如果列表为空,则上述函数失败:在head上添加测试可能是一件好事!

最后,该函数可以修改为处理任何列表mynode*,而不仅仅是head:

void print_list(mynode* somelisthead)
{   
  if(somelisthead==NULL){printf("empty listn");return;}
  mynode* ptr2 = somelisthead; // ptr2 is local : it only exist in this function.
  while((*ptr2).next != NULL)
  {
    printf("%d ",(*ptr2).info);
    ptr2 = (*ptr2).next;
  }   
  printf("%d",(*ptr2).info);
}

现在在main中被称为print_list(head);

你发布的代码调用malloc():这为每个节点分配内存。我猜用free()写一个函数来释放内存是下面的步骤!

下面的代码是否仍然显示分段错误?

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

typedef struct node{
    int info;
    struct node* next;
}mynode; 
void print_list(mynode* somelisthead);
// why ** ? because head and tail are modified by the function. Therefore, passing by argument is required, and a pointer to head named phead is provided to the function.
void insert_data(int data, mynode** phead,mynode** ptail);
mynode *head=NULL,*tail=NULL;
int main()
{
    int nodes,i;
    int data;
    printf("how many nodes u want to insert ?n");
    scanf("%d",&nodes);
    for(i=0;i<nodes;i++)
    {
        printf("Enter datan");
        scanf("%d",&data);
        insert_data(data,&head,&tail);
    }
    print_list(head);
    return 0;
}
void insert_data(int data, mynode **phead,mynode ** ptail)
{
    mynode* ptr = malloc(sizeof(mynode));
    if(ptr==NULL){printf("malloc failedn");exit(1);}
    ptr->info = data;  // ptr-> is equivalent to (*ptr).
    if((*phead) == NULL)
    {
        ptr->next = NULL;
        *phead = ptr;
        *ptail = ptr;
    }
    else
    {
        printf("inside elsen");
        ptr->next=NULL;
        (*ptail)->next = ptr;
        *ptail = ptr;
    }
    return;
}
void print_list(mynode* somelisthead)
{   
    if(somelisthead==NULL){printf("empty listn");return;}
    mynode* ptr = somelisthead; // ptr is local : it only exist in this function.
    while(ptr->next != NULL)
    {
        printf("%d ",ptr->info);
        ptr = ptr->next;
    }   
    printf("%dn",ptr->info);
}

我没有检查scanf()的返回值

在ubuntu gcc上运行代码不会出现分段错误。所以你的代码是正确的。

你的代码的I/O

how many nodes u want to insert5
Enter data2
Enter data3
inside elseEnter data5
inside elseEnter data2
inside elseEnter data1
inside else23521

你能提供一个测试用例,其中你的代码给出分割错误

相关内容

  • 没有找到相关文章

最新更新