当我输入“stuList [1] .name”时,发生了错误,程序崩溃了。我该如何解决这个问题?
#include <stdio.h>
#include <conio.h>
typedef struct student
{
int id;
char *name;
float percentage;
} student;
int main()
{
student stuList[3];
stuList[0].name = "vermidonhapic";
stuList[2].name = "didiervermiyer";
scanf("%s\n",&stuList[1].name);
printf(" name is: %s \n", stuList[0].name);
printf(" name is: %s \n", stuList[2].name);
printf(" name is: %s \n", stuList[1].name);
system("PAUSE");
}
答案 0 :(得分:2)
stuList[1].name
是一个无效指针,因为它尚未初始化为指向有效对象。
您应该为malloc
动态分配内存(通过stuList[1].name
函数),以便scanf
可以写入已分配的对象。
stuList[1].name = malloc(size_enough_to_store_your_string);
此外,stuList[1].name
是指向char
的指针,因此您应该使用stuList[1].name
而不是&stuList[1].name
(指向char
的指针){ {1}}函数调用。
答案 1 :(得分:2)
在此命令中:scanf("%s\n",&stuList[1].name);
您正在从输入中扫描字符串而不实际分配所需的内存。
这导致尝试将数据写入未知地址,这不是您的地址,这会导致分段错误。
要修复它,首先分配内存:stuList[1].name = malloc(MAX_LENGTH);
,然后才能:从stdin扫描字符串。
答案 2 :(得分:2)
name
只是一个指向你自己的内存的指针,因此通过它写入会损坏内存。您需要使用malloc()
为其分配一些内存,或者将其设为数组而不是指针。
答案 3 :(得分:1)
您忘了为stuList[1].name
分配内存。您需要使用malloc
从堆中分配它或堆栈分配它。
stuList[1].name = malloc(MAX_NAME_LENGTH);//heap allocation
//use stuList[1].name
free(stuList[1].name);
char buffer[MAX_NAME_LENGTH];//stack allocation
stuList[1].name = buffer;
我省略了所有错误检查,防止过度运行缓冲区等。
由于stuList[1].name
是指针,因此您在scanf
中获取其地址时出错。