代码抛出分段错误

时间:2013-08-28 06:53:15

标签: c++ list

我试图用c ++中的列表代码帮助朋友。我写道:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

struct list* createlist(FILE *m);
struct list
{
    char *data;
    struct list *next;
}list;

main()
{

    char a[100], ch;
    struct list* obj;
    cout<<"Enter the name of the file for obtaining input.."<<endl;
    cin>>a;
    FILE *in;

    in=fopen(a,"r");
    if(in!=NULL)
    {

        ch=fgetc(in);
        if(ch=='1')
        obj=createlist(in);
        fclose(in);
    }
    return 0;
}

struct list* createlist(FILE *m)
{
    cout<<"Entered createlist function..!"<<endl;
    char *tempStr = (char *)malloc(30 * sizeof(char));
    struct list *curr, *head = (struct list *)malloc(sizeof(struct list));
    curr = head;
    curr->data = tempStr;
    char c;
    int i=0;
    curr=NULL;
     while(EOF!=(c=fgetc(m)))
        {
            if((c==' ') || (c=='\0') || i == 29)
            {
                if(i==0)
                {
                    continue;
                }
                tempStr[i]='\0';
                i=0;
                struct list *temp = curr;
                curr = (struct list *)malloc(sizeof(struct list));
                temp->next = curr;
                tempStr = (char *)malloc(30 * sizeof(char));
                curr->data = tempStr;
                continue;
            }

            tempStr[i]=c;
            i++;
        }
    return head;
}

但代码抛出异常。我试图了解出了什么问题并将代码更改了2-3个小时,并且无法理解。我正在为列表项分配空间,但是当我尝试在行的next处分配值时

temp->next = curr;

我得到了分段错误。

最后,我设法通过从网络而不是我的网络中获取一些代码来解决它:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

struct list* createlist(FILE *m);
struct list
{
    char *data;
    struct list *next;
}list;

main()
{

    char a[100], ch;
    struct list* obj;
    cout<<"Enter the name of the file for obtaining input.."<<endl;
    cin>>a;
    FILE *in;

    in=fopen(a,"r");
    if(in!=NULL)
    {

        ch=fgetc(in);
        if(ch=='1')
        obj=createlist(in);
        fclose(in);
    }
    return 0;
}

struct list* createlist(FILE *m)
{
    cout<<"Entered createlist function..!"<<endl;
    char *tempStr = (char *)malloc(30 * sizeof(char));
    struct list *curr, *head = (struct list *)malloc(sizeof(struct list));
    curr = head;
    curr->data = tempStr;
    char c;
    int i=0;
    curr=NULL;
    while(EOF!=(c=fgetc(m)))
        {
            if((c==' ') || (c=='\0') || i == 29)
            {
                if(i==0)
                {
                    continue;
                }
                tempStr[i]='\0';
                i=0;
                struct list *temp = curr;
                curr = (struct list *)malloc(sizeof(struct list));
                temp->next = curr;
                tempStr = (char *)malloc(30 * sizeof(char));
                curr->data = tempStr;
                continue;
            }

            tempStr[i]=c;
            i++;
        }
    return head;
}

但我仍然不知道我的代码出了什么问题。任何人都可以帮助我理解,所以我将来不会重复我的错误吗?

4 个答案:

答案 0 :(得分:4)

就我所见,两个版本完全相同,但错误很容易辨别。这是你的代码和一些评论

// at this point curr is NULL (see start of while loop)

struct list *temp = curr;
// so now temp is NULL

curr = (struct list *)malloc(sizeof(struct list));
// now curr is pointing at some memory, but temp is still NULL

temp->next = curr;
// temp is NULL so this crashes

和其他人一样,我认为如果你删除curr = NULL;,你就会更近。

答案 1 :(得分:3)

你的'temp'是NULL:

curr=NULL;

然后:

struct list *temp = curr;

最后:

temp->next = curr;

您正在尝试使用具有NULL值的结构指针。

我知道这对你没什么帮助,但是我发现代码还有其他一些问题,而且阅读起来并不容易。

既然你标记了这个C ++,你是否考虑过使用其中一个std容器?喜欢std :: list?

答案 2 :(得分:3)

在while循环之前,您将NULL分配给curr

curr=NULL;

然后,您将curr分配给temp

struct list *temp = curr;

然后当你做

temp->next = curr;

你得到一个分段错误,因为NULL没有下一个指针。

如果您删除curr=NULL;,则应该没问题。

答案 3 :(得分:0)

问题在于你做什么

curr=NULL;

就在他循环之前