调用readContentsOfProcessMapsFile后fgets被跳过,无法等待输入
解决fgets被跳过的问题:修复内存损坏导致的标准输入异常
我帮你找到了问题的根源——你的readContentsOfProcessMapsFile函数里有两处未定义行为,它们破坏了内存结构,间接搞乱了标准输入的状态,导致fgets直接跳过不等待输入。下面是具体的修复方案和解释:
1. 修复realloc的拼写错误
你代码里把内存重分配函数realloc写成了realloca(少了一个字母l),这是一个不存在的函数。调用未定义的函数会触发未定义行为,程序可能会访问非法内存区域,破坏包括标准输入(stdin)相关结构在内的内存数据。
修正后的代码:
filename = realloc(filename, len);
2. 修正sscanf中类型不匹配的格式符
你用%p格式符来读取unsigned long类型的start和end变量,但%p是专门用于读取指针类型的格式符,和unsigned long类型不匹配。这种类型不匹配的格式化输入会导致内存读写错误,同样属于未定义行为,可能干扰程序的其他模块(比如标准输入的状态)。
根据/proc/maps的输出格式(十六进制的地址范围),应该用%lx格式符来读取unsigned long类型的地址:
sscanf(line, "%lx-%lx %c%c%c%c %x %x:%x %u %[^\n]", &start, &end, &read, &write, &exec, &cow, &offset, &dev_major, &dev_minor, &inode, filename);
3. 额外的健壮性优化(可选但推荐)
为了避免内存泄漏和程序崩溃,建议检查realloc的返回值(分配失败会返回NULL):
char* temp = realloc(filename, len); if (temp == NULL) { // 处理内存分配失败的情况 free(filename); free(line); fclose(fd); fprintf(stderr, "Memory allocation failed\n"); return EXIT_FAILURE; } filename = temp;
为什么这些修改能解决问题?
你遇到的fgets被跳过、getchar输出异常字符的现象,都是未定义行为导致内存损坏的副作用。当非法函数调用和类型不匹配的输入操作破坏了内存后,stdin的内部状态被篡改,导致后续的输入函数无法正常工作。修复这些问题后,内存结构恢复正常,fgets就能正常等待用户输入了。
验证步骤
把上述两处核心错误修复后,重新编译运行程序:
readContentsOfProcessMapsFile函数能正常读取/proc/[pid]/maps文件内容- 进入
while循环后,printf("enter name:>")会正常显示,fgets会等待你的输入操作
内容的提问来源于stack exchange,提问作者user9251303
相关产品推荐
相关产品推荐

