C语言学生信息管理程序运行崩溃:类型转换错误求助
问题解决:C语言学生信息展示函数类型不匹配错误
错误原因分析
报错cannot convert 'studinfo' to 'studinfo*' for argument '1' to 'void display(studinfo*, int)'的核心问题是函数调用时参数类型不匹配:
display(s[100], a);中,s[100]是数组s的第101个元素(数组下标从0开始),类型是struct studinfo(单个结构体变量)。- 而
display函数的第一个参数虽然声明为struct studinfo s1[100],但C语言中数组作为函数参数会自动退化为指向数组首元素的指针(即struct studinfo*类型),所以函数实际期望接收的是数组的地址,不是单个结构体元素。
另外代码还有一个小问题:scanf("\n%[^\n]s", s[i].name);中的%[^\n]格式符后面不需要加s,这会导致输入读取异常,应该改为%[^\n]。
修正后的完整代码
#include <stdio.h> struct studinfo{ char name[50]; int roll; float marks; }; void display(struct studinfo s1[], int b); // 数组参数可简化为[],无需指定长度 int main() { int a; printf("Enter the number of students \n"); scanf("%d", &a); struct studinfo s[100]; for(int i = 0; i < a; i++) { printf("Enter the Name :\n"); scanf("\n%[^\n]", s[i].name); // 去掉多余的s printf("Enter the roll no. \n"); scanf("%d", &s[i].roll); printf("\n"); printf("Enter the marks\n"); scanf("%f", &s[i].marks); } display(s, a); // 传递数组名,即数组首地址 return 0; } void display(struct studinfo s1[], int b) { for(int i = 0; i < b; i++) { printf("Name: %s\n", s1[i].name); printf("Roll no: %d\n", s1[i].roll); printf("Marks: %.2f\n", s1[i].marks); // 用%.2f优化浮点数输出格式 } }
关键知识点说明
- 数组作为函数参数的退化特性:当数组名作为函数参数传递时,会自动转换为指向数组首元素的指针,因此函数声明中
struct studinfo s1[100]和struct studinfo* s1是等价的,指定数组长度没有实际意义,建议简化为struct studinfo s1[]。 - 数组下标范围:定义
struct studinfo s[100]时,合法下标是0~99,s[100]属于越界访问,不仅类型错误还会导致未定义行为。 %[^\n]格式符:用于读取包含空格的字符串,直到遇到换行符为止,格式符本身不需要额外加s。
内容的提问来源于stack exchange,提问作者hmmm Mm
相关产品推荐
相关产品推荐

