使用 scanf 读取时产生总线错误的程序 - C 程序

Posted

技术标签:

【中文标题】使用 scanf 读取时产生总线错误的程序 - C 程序【英文标题】:Program producing a bus error when reading in using scanf - C Program 【发布时间】:2022-01-06 17:11:23 【问题描述】:

我正在为员工数据库编写程序,并且正在编写添加员工的函数。在我最后提示扫描信息后,我遇到了总线错误。我很确定这与我的 scanf 语句有关,因为我有一个 print 语句,之后没有打印。为什么会出现这个错误?

有问题的提示是阅读职位名称。

void addEmployee(void)

    char *name;
    char gender;
    int age;
    char *title;

    printf("Enter name: \n");   
    scanf(" %100s", name); 
    scanf("%*[^\n]%*c");

    printf("Enter gender: \n");
    scanf(" %1c", &gender); 
    scanf("%*[^\n]%*c");

    printf("Enter age: \n");
    scanf(" %d", &age); 
    scanf("%*[^\n]%*c");

    printf("Enter job title: \n");
    scanf(" %100s", title); 
    scanf("%*[^\n]%*c");

    printf("Test");
    
    printf("The employee you've entered is: %s %c %d %s \n", name, gender, age, title);

    Employee newEmp = *name, gender, age, *title;
    
    if(employeeList[0] == NULL)
    
        employeeList[0] =  &newEmp;
        nodeCount++;
    

【问题讨论】:

nametitle 指向多少内存?当scanf 试图读入那些指针指向的内存时会发生什么? 您必须为字符串分配存储空间。你有指向任何东西/垃圾的指针 name 甚至没有分配,你需要在 scanf 中使用之前对其进行 malloc/calloc 不是您的问题,而是:(1) 您不需要" %100s"" %d" 中的前导空格。 (2) 鉴于您(正确地)使用" %1c" 中的额外空间,您不需要那些scanf("%*[^\n]%*c"); 行;他们只是在混淆额外的噪音。 注意:当stdin 中的下一个字符是'\n' 时,scanf("%*[^\n]%*c"); 没有任何用处。 '\n' 仍保留在 stdin 中。 【参考方案1】:

代码正在传递一个未初始化的指针。

char *name;  // Pointer 'name' not initialize yet.
printf("Enter name: \n");   
// 'name' passed to scanf() is garbage.  
scanf(" %100s", name);

相反,传递一个指向现有数组的指针

char name[100 + 1];
printf("Enter name: \n");   
// Here the array 'name' coverts to the address of the first element of the array.
// scanf receives a valid pointer.
scanf("%100s", name);  

【讨论】:

以上是关于使用 scanf 读取时产生总线错误的程序 - C 程序的主要内容,如果未能解决你的问题,请参考以下文章

从 scanf 读取 C 样式字符串时出现分段错误

如何使用C从键盘读取字符串?

C语言,程序读取标准输入是啥意思?

将 scanf 与 x86-64 GAS 程序集一起使用

错误输入C后结束scanf [重复]

运行简单的字符串 C 程序时出现总线错误 [重复]