分段故障:使用scanf时为11。不读过UUN吗?

时间:2015-12-17 17:09:39

标签: c segmentation-fault scanf

我是初学者,已经搜索了所有问题并尝试了相关答案,但似乎没有任何效果。 它读取姓名和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));
        }
    }
}

1 个答案:

答案 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的其他用途一样,该行确实存在其他一些问题:

  1. 您应该始终检查返回的值(而不是参数值)以确保操作成功。 (在这种情况下,如果返回的值不等于1,则失败)
  2. 格式说明符:'%s'不限制输入的字符数。这可能导致输入缓冲区溢出,这是未定义的行为,导致segfault事件。​​
  3. 建议使用:

    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”)则不能。