C代码运行后后续命令被忽略 输入内容后程序异常退出问题排查
问题根因
- 野指针非法访问:代码中仅声明了
char* ptr字符指针,未为其分配任何可写的内存空间,指针指向的地址是随机、未授权的。调用gets()向该地址写入输入内容时,触发内存访问越界,操作系统直接终止进程,因此程序输入后直接崩溃退出,后续代码无法执行。 gets()为已废弃的危险函数:该函数不校验输入内容长度,无论缓冲区是否有足够空间都会写入所有输入内容,极易触发缓冲区溢出漏洞,C11标准已正式移除该函数,任何场景都不建议使用。
修复方案
方案1:使用栈上固定大小缓冲区(实现最简单,适合普通场景)
#include <stdio.h> #define BUF_SIZE 1024 // 可根据实际输入长度需求调整缓冲区大小 int main() { char buf[BUF_SIZE]; printf("Enter the word: "); // 用fgets替代gets,指定缓冲区大小避免溢出 fgets(buf, BUF_SIZE, stdin); printf("The input string is: "); puts(buf); return 0; }
方案2:使用动态分配内存的指针(适合需要灵活控制内存生命周期的场景)
#include <stdio.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 1024 int main() { // 为指针分配可写内存 char* ptr = (char*)malloc(BUF_SIZE * sizeof(char)); if (ptr == NULL) { perror("内存分配失败"); return 1; } printf("Enter the word: "); fgets(ptr, BUF_SIZE, stdin); // 可选:去除fgets读取的末尾换行符 ptr[strcspn(ptr, "\n")] = '\0'; printf("The input string is: "); puts(ptr); // 释放动态申请的内存,避免内存泄漏 free(ptr); return 0; }
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

