【发布时间】:2013-02-08 13:31:10
【问题描述】:
我有一个任务并且遇到了一些障碍。以下代码应该从文件中获取输入,将其读入我定义的结构中,并且对输入行数没有任何限制。但是,它在 24 行出现了段错误:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 typedef struct __student {
6 int ID;
7 char fname[33];
8 char lname[33];
9 float grade;
10 } student;
11
12 void partA(FILE *fp) {
13
14 int i, r;
15 i = r = 0;
16 int N = 1000;
17 student **S;
18
19 S = (student **)malloc(sizeof(student *) * N);
20
21
22 while(!feof(fp)){
23 fscanf(fp, "%d %[^,], %s %f", &S[i]->ID, S[i]->lname, S[i]->fname, &S[i]->grade ); // segfault occurs on this line
24 printf("%d %s %s %f\n", S[i]->ID, S[i]->fname, S[i]->lname, S[i]->grade);
25 i++;
26 printf("Something's happening, at least");
27 if(i == N){
28 N *= 2;
29 S = (student **)realloc(S, sizeof(student) * N);
30 if(S == NULL) {
31 printf("Memory reallocation failed; Fatal error.");
32 break;
33 }
34 }
35 }
36 }
我之前测试过代码,虽然当时我使用的是静态数组并想更改为动态大小。然而,即使 gdb with 除了行号之外提供的帮助也很少。我需要单独 malloc 每个 student 结构,还是我在这里遗漏了一些完全不同的东西?
编辑:当我在while循环中为每个学生分配内存时,代码似乎有效:
S[i] = (student *)malloc(sizeof(student));
所以这似乎已经解决了这个问题。我会进行一些测试以确保。
【问题讨论】:
-
这看起来像一个奇怪的链接列表\二维数组。你要哪个?
-
您能解释一下输入行的格式吗?
"%d %[^,], %s %f"你为什么要用','这样做? -
安德烈,这是一个疏忽,我很抱歉。我之前尝试过 LL 方法,但发现它不是我需要的。 @AdriánLópez 输入数据的格式为
, 。我只是使用扫描集来摆脱逗号。我很抱歉没有提到这一点! -
是的,您必须为每个学生分配内存,或者您可以分配一个
students数组作为开头,而不是一个指向学生的指针数组。 IE。将S = (student**)malloc(sizeof(student*)*N)替换为S = (student*)malloc(sizeof(student)*N)。 -
确实问题出在您的内存分配上。您需要
N * the size of the structure的内存,而不是N * the size of a pointer to your structure。
标签: c segmentation-fault dynamic-arrays scanf