程序接收信号SIGSEGV,分段错误,链接列表程序

时间:2013-09-08 20:11:32

标签: c segmentation-fault

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

typedef struct node{
    int value;
    struct node* next;
}Node;

Node* createNode(int data);
Node* insertFront(Node* first, Node* newNode);
void printList(Node* first); 
void deleteList(Node* first);

int main(int argc, const char **argv)
{
    int numItems, ch;
    FILE *fp;

    fp = fopen(argv[1], "r");
    while ((ch = getc(fp)) != EOF)
    {
        if (ch = '\n') numItems++;
    }
    fclose(fp);

    Node *first = NULL;
    Node *newNode;
    Node *Next;

    int i;

    for(i = 1; i <= numItems; i++)
    {
        newNode = createNode(i);
        first = insertFront(first, newNode);
    }

    printList(first);
    deleteList(first);

    return 1;
}

Node* createNode(int data)
{
    Node *newNode;

    newNode = malloc(sizeof(Node));

    newNode -> value = data;

    newNode -> next = NULL;

    return newNode;
}

Node* insertFront(Node* first, Node* newNode)
{
    if (newNode == NULL) {
        /* handle oom */
    }

    newNode->next=NULL;

    if (first == NULL) {
        first = newNode;
    }

    else {
        Node *temp=first;

        while(temp->next!=NULL)
        {
            temp = temp->next;
        }

        temp->next=newNode;

        first = newNode;
    }

    return first;
}

void printList(Node* first)
{
    Node *temp;
    temp=first;

    printf("elements in linked list are\n");
    while(temp!=NULL)
    {
        printf("%d\n",temp->value);
        temp=temp->next;
    }
}

void deleteList(Node* first)
{
    Node  *temp;
    temp=first;
    first=first->next;
    temp->next=NULL;
    free(temp);
}

尝试使用gdb运行,​​这就是我得到的,第一次尝试制作链表的真实体验。

编程接收信号SIGSEGV,分段故障。 getc.c中的_IO_getc(fp = 0x0):40 40 _IO_acquire_lock(fp);

我不确定我在这里做错了什么?感谢提前提示。

1 个答案:

答案 0 :(得分:1)

您没有将numItems初始化为零。作为单位化,它可以是任何数字,包括例如消极的。因此,您的列表未创建,因此指针 first 指向NULL。然后代码段函数 deleteList ,当它试图释放位置为NULL的内存时。