在我的C程序中需要一些帮助,我有一个分段错误,但我不知道为什么

时间:2017-02-18 18:30:25

标签: c segmentation-fault

我试图创建一个单独的链表,其中包含我桌面上.txt文件中的一些单词,但是当我在终端中运行它时,我遇到了分段错误。后来我在Xcode上编译代码并运行它,我收到此错误消息: 主题1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff5fc00000) 我是初学者,现在我真的需要一些帮助。谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct word{
    int  num;
    char word[50];
    struct word *next;
} Word;
#define len sizeof(Word)

Word *create();
void print(Word *head);

int main()
{
    Word *head;
    head = create();
    print(head);
    return 0;
}

Word *create()
{
    Word *head, *p1, *p2;
    char word[50], c;
    int i = 0;
    FILE *fp = fopen("/Users/apple/Desktop/words", "r");

    head = p1 = p2 = NULL;

    while(fp != NULL){
        i = 0;
        p1 = (Word *)malloc(len);

    //get the English word
    while((c = fgetc(fp)) != '\n'){
        word[i++] = c;
    }
    word[i] = '\0';
    strcpy(p1->word, word);
    p1->next = NULL;

        if(head == NULL){
            head = p1;
            p2 = p1;
        } else {
            p2->next = p1;
            p2 = p1;
        }
        p1 = p1->next;
    }

    return head;
}

void print(Word *head)
{
    Word *p = head;
    while(p != NULL){
        printf("%s\n", p->word);
        p = p->next;
    }
}

这是.txt文件的内容:

enter image description here

1 个答案:

答案 0 :(得分:1)

在您的问题被删除之前,以下是您在代码中执行的一些不正确的操作,甚至在您尝试修复segfault之前就应该看一下。

obj.x = 10 and obj.y = john

这不是你从文件中读取的方式。文件指针obj2.x = 12 and obj2.y = matt 不是预期的更改。如果您想知道文件是否已完成,则必须检查读取函数的输出。当您尝试读取文件的最后一个字符时,while(fp != NULL){ i = 0; p1 = (Word *)malloc(len); fp会返回fscanf()

此外,使用fgetc()It's almost always wrong

EOF

feof()会返回while((c = fgetc(fp)) != '\n'){ word[i++] = c; } ,因此您应该声明fgetc()。这就是你如何检查你是否已阅读所有内容。阅读完最后一个单词后,(int)将返回int c。通常为fgetc(),但无论其价值如何,它都不适合EOF。您需要-1

此外,您应该使用(char)而不是将其读取为char-by-char(除非您的任务是这样做的)。 (int)会一直读到该单词的结尾,并自动添加fscanf()

fscanf()

不会帮助你。那0对你没有好处。 p1 = (Word *)malloc(len); 也不是。len。这就是你应该做的:

(Word*)

甚至更好

p1 = malloc(sizeof (Word));

最后一个甚至不需要你知道p1 = malloc(sizeof *p1); 的类型。