C语言自定义函数无法正常跳转执行问题求助
C语言程序函数跳转异常问题排查与修正
你的代码存在多处语法错误、内存越界和逻辑问题,导致程序无法正常执行函数跳转,甚至直接崩溃。以下是具体问题和修正方案:
核心问题与修正
1. 头文件缺失
代码使用了printf、scanf等标准IO函数,但未包含<stdio.h>头文件,会引发编译错误或运行异常。
修正:在开头添加#include <stdio.h>
2. 函数结构错误
void main()后直接跟函数声明,语法违规,main函数的花括号需紧跟声明;且函数声明应放在main函数外部。- C语言不允许在函数内部定义其他函数,你将
regis_name、regis_dob、regis_pin定义在main内部,属于非法写法,会导致编译失败。
修正:将所有函数声明放在main函数之前,函数定义放在main函数之后。
3. 数组与指针操作错误
- 数组下标越界:
d[1]、m[1]、y[1],你定义的数组是d[1],仅d[0]为有效下标,访问d[1]会越界访问内存,引发程序崩溃。 - 指针赋值错误:
a1 = a;中a是int变量,a1是int指针,应改为a1 = &a;;d1[1] = &d[1];同样存在下标越界,且这类指针数组完全没必要,直接用普通变量即可。
修正:删除冗余指针变量,用普通变量存储数据,避免越界。
4. 函数调用与输入错误
regis_name中scanf("%s", name[3]);错误:scanf需传入字符串首地址,name本身就是首地址,name[3]是越界字符值,会导致内存访问错误,程序崩溃。regis_dob中regis_pin;缺少括号,这只是引用函数地址,不会调用函数,正确写法是regis_pin();。name数组长度过小:char name[3]仅能存2个字符加结束符,无法正常存储姓名,会引发缓冲区溢出。
修正:将scanf("%s", name[3]);改为scanf("%s", name);,并增大数组长度为char name[50];。
5. 其他语法错误
- 代码中存在无效的
bd字样,需删除。 void main()不符合C标准,应改为int main(),并在末尾添加return 0;。check()函数未定义,调用会引发链接错误,需补充实现或暂时注释调用。
修正后的代码示例
#include <stdio.h> #include <string.h> // 函数声明 void regis_name(); void regis_dob(); void regis_pin(); // void check(); // 未实现可先注释 int main() { regis_name(); // 从姓名录入开始,匹配你描述的流程 return 0; } void regis_name() { char name[50]; // 增大数组长度 printf("ADD YOUR NAME: \n"); scanf("%s", name); // 传入数组首地址 regis_dob(); // 跳转至出生日期录入 } void regis_dob() { int d, m, y; // 用普通变量替代数组,避免越界 printf("enter date in 'dd' month in 'mm' year in 'yyyy' \n\n"); printf("enter dd: \n"); scanf("%d", &d); printf("enter mm: \n"); scanf("%d", &m); printf("enter yyyy: \n"); scanf("%d", &y); regis_pin(); // 正确调用函数 } void regis_pin() { int a; printf("ADD A PASS CODE OF 4 DIGIT: \n"); scanf("%d", &a); printf("\n"); // check(); // 未实现可先注释 }
额外建议
- 补充
check函数实现,完成日期合法性、PIN码长度等校验逻辑。 - 使用
fopen、fprintf函数将用户信息写入文件,完成保存功能。 - 处理输入缓冲区残留的换行符,避免影响后续输入。
内容的提问来源于stack exchange,提问作者Abhiram
相关产品推荐
相关产品推荐

