【发布时间】: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