我有一个任务并且遇到了一些障碍。以下代码应该从文件中获取输入,将其读入我定义的结构中,并且对输入行数没有任何限制。但是,它在第 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 每个学生结构,或者我在这里错过了一些完全不同的东西?
编辑:当我在while循环中为每个学生分配内存时,代码似乎有效:
S[i] = (student *)malloc(sizeof(student));
所以这似乎解决了这个问题。我会进行一些测试来确定。