You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:52