我是初学者,已经搜索了所有问题并尝试了相关答案,但似乎没有任何效果。 它读取姓名和UUN然后说分段错误:11并退出。 请帮忙!
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
答案 0 :(得分:1)
你的主要问题是你在读取未初始化指针的循环中,例如:
scanf(“%s”,student_t [i] .name);
可能的解决方法可能是这些:
char tmp[256];
if (scanf(" %255s", tmp) != 1) { /* handle error */ }
student_t[i].name = strdup(tmp);
段错误事件的另一个常见来源(您确实避免)是这种行:
student_t[1].name = "Lady";
将字段'name'设置为指向文字字符串(此处为“Lady”),该字符串很可能位于只读存储器中。然后,如果您稍后尝试读入同一位置:
scanf(" %s", student_t[i].name);
它会尝试将扫描的数据写入指针指向的位置(进入只读存储器)。这是未定义的行为,也会导致段错误事件。即使原始值(“Lady”)碰巧位于读写内存中,它也可能只对“Lady”来说足够大 - 不能保证它可以保存更长的字符串(比如“Christopher”) )。
与scanf的其他用途一样,该行确实存在其他一些问题:
建议使用:
char buffer[256];
...
printf("Enter your name: ");
if ( 1 != scanf( " %255s", buffer ) )
{
perror( " scanf for name failed" );
cleanup(); // free all memory allocations
exit(1);
}
// implied else, scanf successful
student_t[i].name = strdup(buffer);
为了使cleanup()
更容易,建议更改这样的行:
student_t[2].name = "James";
到
student_t[2].name = strdup("James");
因为strdup()
分配的内存应该返回到free()
的系统,而文字值(如“Lady”)则不能。