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来说比较新!
这一行:
*(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读取线(从标准输入太)再破这条线到它的成分.这可能最初需要更多的代码来实现,但可以产生更安全,更可预测的代码.