使用 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++;
【问题讨论】:
name
和 title
指向多少内存?当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 程序的主要内容,如果未能解决你的问题,请参考以下文章