c - C 中的指针数组和段错误(核心转储)

标签 c pointers segmentation-fault scanf

我正在尝试用 C 语言编写一个程序,该程序从输入文件(“input0”)中读取,该文件遵循以下格式: 无名氏1230 4.0

我正在尝试使用 fscanf 从文档中读取并将这些值输入到结构中。但目前,在编译并运行代码后,我遇到了神秘的“段错误(核心转储)”。

我的代码中的行当前发出此错误,即带有 fscanf 语句的行。我找不到解决方案。

此外,一旦取消注释,strcpy 就会给出错误。当我运行代码时,我收到一条警告,我认为这与指针和字符串之间存在差异,这是我无法解决的另一个问题。任何帮助将不胜感激。

typedef struct {
    char fname[1000];
    char lname[1000];
    long int id;
    double gpa;
} student_t;

int main(int argc, char *argv[]) {
    FILE *db;
    student_t students[1000];
    char* fname[1000];
    char* lname[1000];
    long int id[1000];
    double gpa[1000];
    long int i, j;
    i = 0;
    db = fopen("input0", "r");
    while(fscanf(db, "%s %s %d %lf", fname[i], lname[i], id[i], gpa[i]) != EOF) {
        //strcpy(students[i].fname, fname[i]);
        //strcpy(students[i].lname, lname[i]);
        students[i].id = id[i];
        students[i].gpa = gpa[i];
        i++;
    }
    for(j = 0; j <= i; j++) {
    //printf("%s %s %d %f\n", _SJ.fname, _SJ.lname, _SJ.id, _ST.gpa);
    }
    fclose(db);
}

最佳答案

当您声明例如时

char* fname[1000];

你有一个1000未初始化指针的数组。尝试使用这些指针之一将导致未定义的行为。您需要为指针分配内存,或将它们指向其他(已分配的)内存。

事实上,我认为你真正想做的是

fscanf(db, "%s %s %d %lf",
    students[i].fname, students[i].lname, &students[i].id, &students[i].gpa)
<小时/>

我还建议您阅读例如this fscanf reference ,因为 fscanf 可以返回其他值,这意味着输入中存在错误(例如,如果输入文件格式错误)。

关于c - C 中的指针数组和段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772099/

相关文章:

c - 尝试使用调用 stat 的 ctime 返回值对 c 中的结构数组进行排序

无法使用库 dc1394 在视频模式 format7_4 下设置图像大小

c++ - 如何在没有 shared_ptr 的情况下管理 cpp 中的原始指针?

C——指向指针数组的指针

c++ - valgrind 未检测到的 malloc_consolidate (malloc.c) 中的段错误

c - Memmove 重叠

c++ - 无法理解new int(2)的含义

c++ - 您如何理解错误 : cannot convert from 'int []' to 'int []'

c++ - 打印抽象对象c++

c - FILE IO,标记字符串