使用scanf()读取第三个解引用整数时程序崩溃,如何修复?
scanf读取整数超时/无法执行到后续代码的问题
问题代码及现象
第一段代码:
int main(int argc, char *argv[]) { int *v1, *v2, *v3; printf("Enter three integers: "); scanf("%d %d %d", v1, v2, v3); printf("We made it this far?\n"); /* Other stuff after */ return 0; }
现象:输入任意三个整数时,程序看似能给*v1、*v2赋值,但给v3分配第三个整数时会超时;输入超过三个整数也会出现同样问题,从未执行到调试打印语句"We made it this far?"。
拆分逐个读取的代码:
int main(int argc, char *argv[]) { int *v1; int *v2; int *v3; printf("Enter three integers: "); scanf("%d ", v1); printf("%d\n", *v1); scanf("%d ", v2); printf("%d\n", *v2); scanf("%d\n", v3); printf("%d\n", *v3); printf("We made it this far?\n"); return 0; }
现象同样是无法执行到最后的打印语句,无论变量名、输入内容如何都会出现问题。
问题原因
野指针导致的未定义行为:
v1、v2、v3都是int*类型的指针,但声明后没有指向任何有效的内存地址,属于野指针。scanf的%d格式需要传入变量的内存地址,这里直接传入野指针,会导致程序向非法内存地址写入数据,触发未定义行为——前两次操作可能看似正常,但实际上已经破坏了内存,第三次操作就会导致程序崩溃或卡住。scanf格式字符串的多余空白字符:
拆分后的代码中,scanf的格式字符串带有空格(%d)或换行(%d\n),scanf会将格式中的空白字符视为匹配任意数量的空白字符(包括空格、换行、制表符等),所以输入完数字后,程序会持续等待,直到遇到非空白字符,这也是导致"超时"的直接原因之一。
解决方案
方案1:使用普通int变量(最常用的正确写法)
将指针替换为普通int变量,通过&取地址符传入scanf:
#include <stdio.h> int main(int argc, char *argv[]) { int v1, v2, v3; printf("Enter three integers: "); scanf("%d %d %d", &v1, &v2, &v3); printf("We made it this far?\n"); printf("输入的三个数:%d, %d, %d\n", v1, v2, v3); return 0; }
方案2:给指针分配有效内存(如果必须使用指针)
通过malloc为指针分配内存,使用完后记得释放:
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int *v1 = malloc(sizeof(int)); int *v2 = malloc(sizeof(int)); int *v3 = malloc(sizeof(int)); // 检查内存分配是否成功 if (!v1 || !v2 || !v3) { printf("内存分配失败\n"); return 1; } printf("Enter three integers: "); scanf("%d %d %d", v1, v2, v3); printf("We made it this far?\n"); printf("输入的三个数:%d, %d, %d\n", *v1, *v2, *v3); // 释放分配的内存 free(v1); free(v2); free(v3); return 0; }
拆分读取的正确写法
去掉scanf格式字符串中的多余空格和换行:
#include <stdio.h> int main(int argc, char *argv[]) { int v1, v2, v3; printf("Enter three integers: "); scanf("%d", &v1); printf("%d\n", v1); scanf("%d", &v2); printf("%d\n", v2); scanf("%d", &v3); printf("%d\n", v3); printf("We made it this far?\n"); return 0; }
内容的提问来源于stack exchange,提问作者SomethingLikeThat
相关产品推荐
相关产品推荐

