我的分段错误的原因是什么?

Ada*_*fer 1 c arrays structure segmentation-fault

我正在尝试编写一个程序,使用输入重定向将文件中的条目读入动态分配的结构数组中.我的程序编译得很好但是我遇到了分段错误而且我找不到原因.

这是我的计划:

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

typedef struct StudentData
{
char* name;
char* major;
double gpa;
} Student;

int main()
{
Student* data = (Student*)malloc(sizeof(Student)*5);

int i;
for(i = 0; i < 5; i++)
{
 // allocate memory for name and read input
 data[i].name = malloc(50);
 *(data+i)->name == scanf("%s", (char*)&data[i].name);

 // allocate memory for major and read input
 data[i].major = malloc(30);
 *(data+i)->major == scanf("%s", (char*)&data[i].major);

 // read input for gpa
 (data+i)->gpa == scanf("%lf", &data[i].gpa); 

 //print array
 printf("%s\n%s\n%f\n", data[i].name, data[i].major, data[i].gpa);
 }
}  
Run Code Online (Sandbox Code Playgroud)

有线索吗?如果它看起来很明显,那是因为我对C来说比较新!

Eli*_*sky 6

这一行:

*(data+i)->name == scanf("%s", (char*)&data[i].name);
Run Code Online (Sandbox Code Playgroud)

==暂时忽略这些奇怪和虚空&data[i].name是错误的,因为你正在拿一个指针的地址.data[i].name这里就足够了,因为该name字段已经是一个scanf可以写入的地址了.

和演员,以(char*)什么可能关闭编译了一下 -你进入它用于此目的:-)?因为&data[i].name有类型char**,scanf不接受,除非你强行把它投入char*.

作为一般的建议,尽量避免scanf-它导致非常不安全的代码,而不是使用(如你刚才看到的!)fgets读取线(从标准输入太)再破这条线到它的成分.这可能最初需要更多的代码来实现,但可以产生更安全,更可预测的代码.