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

在我的C程序中需要一些帮助,我';我有一个分段错误,但我没有';我不知道为什么,c,segmentation-fault,C,Segmentation Fault,我试图创建一个单链表,其中包含桌面上.txt文件中的一些单词,但当我在终端中运行它时,我遇到了一个分段错误。后来我在Xcode上编译代码并运行它,我得到了以下错误消息: 线程1:EXC\u坏访问(代码=1,地址=0x7fff5fc00000) 我是初学者,现在真的需要一些帮助。谢谢 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct word{ int n

我试图创建一个单链表,其中包含桌面上.txt文件中的一些单词,但当我在终端中运行它时,我遇到了一个分段错误。后来我在Xcode上编译代码并运行它,我得到了以下错误消息: 线程1:EXC\u坏访问(代码=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;
    }
}
#包括
#包括
#包括
typedef结构字{
int-num;
字符字[50];
结构词*next;
}字;
#定义长度大小(Word)
Word*create();
空白打印(字*头);
int main()
{
字*头;
头=创建();
打印头;
返回0;
}
Word*创建()
{
单词*head,*p1,*p2;
字符字[50],c;
int i=0;
FILE*fp=fopen(“/Users/apple/Desktop/words”,“r”);
水头=p1=p2=NULL;
while(fp!=NULL){
i=0;
p1=(单词*)malloc(len);
//获取英语单词
而((c=fgetc(fp))!='\n'){
字[i++]=c;
}
字[i]='\0';
strcpy(p1->word,word);
p1->next=NULL;
if(head==NULL){
水头=p1;
p2=p1;
}否则{
p2->next=p1;
p2=p1;
}
p1=p1->next;
}
回流头;
}
空白打印(字*头)
{
单词*p=头部;
while(p!=NULL){
printf(“%s\n”,p->word);
p=p->next;
}
}
这是.txt文件的内容:


在您的问题被删除之前,以下是您在代码中执行的一些不正确的操作,您应该在尝试修复错误之前查看这些操作

while(fp != NULL){
    i = 0;
    p1 = (Word *)malloc(len);
这不是你读取文件的方式。文件指针
fp
不应更改。如果想知道文件是否已完成,必须检查读取函数的输出
fscanf()
fgetc()
尝试读取文件的最后一个字符时返回
EOF

另外,不要使用
feof()

fgetc()
返回一个
(int)
,因此您应该声明
int c
。这就是你检查自己是否阅读了所有内容的方式。阅读最后一个单词后,
fgetc()
将返回
EOF
。它通常是
-1
,但是,不管它的值如何,它都不适合
(char)
。您需要
(int)

此外,您应该使用
fscanf()
,而不是逐字符读取它(除非这是您的任务)
fscanf()
读取到单词末尾,并自动添加
0

这个

这对你没有帮助。那
len
对你没有任何好处。两者都不是
(Word*)
。这是您应该做的:

p1 = malloc(sizeof (Word));
甚至更好

p1 = malloc(sizeof *p1);

最后一个甚至不要求您知道
p1的类型

欢迎使用SO。我强烈建议花一些时间学习如何使用调试器。这是解决问题的第一步。请阅读。因此,它不是调试服务。一旦你确定了问题所在,如果你不明白为什么会出现问题,那么就一定要问一个问题。首先使用调试器捕捉实际发生的崩溃,这样你就能在代码中找到它发生的地方。然后,当您知道并且仍在调试器中时,检查所有相关变量的值,以确保它们看起来正常。至少请给我们这些信息(位置和值)。你把一个图像放在一个.txt文件中?像你发布代码一样发布文本文件:每个单词前有四个空格。还有,结尾有空行吗?非常感谢你的建议!我会记住这些并重写我的代码。
p1 = malloc(sizeof (Word));
p1 = malloc(sizeof *p1);