【问题标题】:Program received signal SIGSEGV, segmentation fault, Linked list program程序接收信号SIGSEGV,分段错误,链表程序
【发布时间】:2013-09-08 20:11:31
【问题描述】:
#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,分段错误。 _IO_getc (fp=0x0) at getc.c:40 40 _IO_acquire_lock (fp);

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

【问题讨论】:

  • numItems 未初始化。
  • 只是看起来无法打开文件。 fopen() 返回 NULL,你将它传递给 getc(),然后崩溃。经常检查 fopen() 和其他容易失败的库函数的返回值!
  • 在提问之前,请阅读SSCCE。你可以通过修整问题来解决这个问题。

标签: c segmentation-fault


【解决方案1】:

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

【讨论】:

  • free(NULL)是可以的,但是读取未初始化的数据是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多