【问题标题】:how do I deal with this segmentation error我该如何处理这个分段错误
【发布时间】:2020-04-25 08:41:11
【问题描述】:

我不断收到相同的消息“分段错误:11”
gdb 告诉我断点就在 main 函数之后。在我声明 int j 的行中; 我真的不明白这怎么可能破坏代码。

此函数读取的输入仅由 1 个字符串和 2 个数字组成,例如

约翰 22 43 山姆 11 23

它应该做的只是将整个输入存储在“elenco”中,然后打印字符串。

首先我创建了一个与输入匹配的结构。 然后我做了一个函数,目的是读取输入并存储在变量中。 然后我创建了一个函数,其变量是读取输入(所以输入)并打印给定字符串的函数的输出

谁能帮我找出问题并解决它?

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

typedef struct
{
    char name[20];
    int distance;
    int point;
}  throw;

throw *read_file(FILE *f, int *j)
{
    int i = 0;
    int c;
    int Dim = 32;
    char buf[1000];
    throw *list;

    list = malloc(Dim *sizeof(*list));
    if (list == NULL)
    {
        (*j) = 0;
        return NULL;
    }
    while (fgets(buf, sizeof(buf), f)!= NULL)
    { 
        sscanf(buf, "%19s %d %d",
        list[*j].name,
        &list[*j].distance,
        &list[*j].point);
        *j += 1;

        if ( *j >= Dim)
        {
            Dim = Dim*2;
            list = realloc(list, Dim *sizeof(*list));
            if (list == NULL)
            {
                return NULL;           
            }
        }
    }
    return list;
}

void print_everything(throw *list, int j)
{
    int c;
    for (c=0; c < j; c++ )
    {
        printf("%d\n",list[c].distance);
    }
}

int main(int argc,const char  *argcv[])
{
    int j = 0;
    FILE *file;
    throw *list;
    if (!( argc != 3))
    {
        printf("file's dimension is wrong\n");
        return -1;
    }

    file = fopen(argcv[1], "r");

    list = read_file(file, &j);

    print_everything(list, j);
    fclose(file);

    return 0;
}

input1.txt

马里奥 20 30
乔治 30 40
马里奥 40 40
戴维德 32 20
马里奥 9 32

这正是文件包含的内容

【问题讨论】:

  • 你能通过翻译成英文和删除不需要的空行来简化你的代码阅读吗?缩进会是一个很好的接触。
  • if (!( argc != 3)) 而不是if (( argc == 3)),为什么?它抱怨得到 2 个参数,但没有给出任何参数都可以。然后你假设至少有一个file = fopen(argcv[1], "r");。在这种情况下,我不会对段错误感到惊讶。加上其他一些假设,if ( argc != 3) 可能会解决您的问题。
  • 我敢问elenco 在哪里声明
  • 如果只给出一个论点,请解释if (!( argc != 3))。对于经常得到一个参数的程序,我希望得到一个 2 而不是 3 并且少一个 !
  • 我的荣幸。现在请解释if (!( argc != 3))。它仍然存在,您不应该删除它,因为类似的行可以保护您免受至少一个潜在的段错误源的影响。正如我在之前的评论中所描述的那样,只需要正确完成即可。

标签: c memory-management segmentation-fault gdb storing-data


【解决方案1】:

你的程序很好。你的问题在 input1.txt ,你需要

Mario 20 30
Giorgio 30 40
Mario 40 40
Davide 32 20
Mario 9 32

使用 fgets() 阅读时,每一行都需要一个 \n

【讨论】:

  • 谢谢大家,终于成功了。这是我在输入时犯的一个非常微不足道的错误。你给了我很多很好的建议并完善了几行不起眼的代码,非常感谢
  • 抱歉。 OP对这个问题的最后评论似乎证实了你......虽然它让我感到困惑......
【解决方案2】:

对您的代码进行了一些更改,您正在使用列表错误尝试使用指针

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

#define MAXSTR 250

typedef struct elenco
{
    char *name;
    int distance;
    int point;
    struct elenco *next;
}  throw;

throw *list_add(throw *list, int distance, int point, const char *name)
{
    throw *new = malloc(sizeof(throw));
    if (new != NULL) {
        new->distance = distance;
        new->point = point;
        new->name =(char*)malloc(strlen(name)+1);
        strcpy(new->name,name);
        new->next = list;
        return new;
    }
    return list;
}

throw *read_file(FILE *f)
{
    char buf[MAXSTR];

    throw *list = malloc(sizeof(throw));

    while (fgets(buf, sizeof(buf), f)!= NULL)
     { 
         char name[MAXSTR];
         int distance;
         int point;
        sscanf(buf, "%s %d %d",
            name,
            &distance,
            &point);

            list = list_add(list, distance, point, name);
}
    return list;
}


void print_everything(throw *list)
{

    while (list) {
        printf("%d\n",list->distance);
        list = list->next;
    }

}


int main()
{
    int argc;
    const char  *argcv;
    FILE *file;

    if (!( argc != 3))
    {
    printf("file's dimension is wrong\n");
    return -1;
    }


    file = fopen(&argcv[1], "r");

    throw *list = read_file(file);
    print_everything(list);

    fclose(file);

return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2019-09-20
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多