【问题标题】:segmentation fault, address out of bounds分段错误,地址越界
【发布时间】:2011-07-24 09:48:13
【问题描述】:

我正在编写一个函数,它从用户那里获取一个输入字符串,直到遇到换行符,然后将字符串解析为每个单词并将它们放入一个数组中。

我遇到的问题是,当您第一次启动程序时,如果您输入空格作为输入,则会出现分段错误。如果你放别的东西,它运行良好。然后,如果您之后只输入空格作为输入,它也可以正常运行。

这是函数的sn-p:

#define MAXARGS 10

char buf[100];
char cmd[MAXARGS][100];
char *bp = NULL;
int i, n;

for (i = 0; i < MAXARGS; i++)
    strcpy(cmd[i], "");

fputs(" >> ", stdout);
fgets(buf, sizeof(buf), stdin);
bp = buf;

for (i = 0; i < MAXARGS; i++)
{
    sscanf(bp, "%99s%n", cmd[i], &n);
    bp += n;
    while (*bp == ' ') // segfault is here
        bp += 1;
}

我在 Windows 上运行带有 MSYS 的 MinGW。 当我通过 GDB 运行它时,我得到:

Program received signal SIGSEGV, Segmentation fault.
0x0040152d in command () at main.c:46
46                              while (*bp == ' ')
(gdb) print bp
$1 = 0x47291c <Address 0x47291c out of bounds>
(gdb) print *bp
Cannot access memory at address 0x47291c

...但我对 GDB 不熟悉,所以我不知道还要检查什么

【问题讨论】:

    标签: c pointers segmentation-fault


    【解决方案1】:

    sscanf 应该返回匹配项的数量,如果它不能匹配任何内容,它将返回 0 并且 n 将保留之前的值,并且您最终使用 n 来增加指针。
    在使用 n 之前检查 sscanf 返回的内容,如果返回 0,则不要使用它

    【讨论】:

      【解决方案2】:

      打印n。我怀疑它得到了一个非常出乎意料的值(也许是负数?虽然这不太可能)。

      【讨论】:

      • 确实如此! 200万范围内的东西......所以我最终试图比较一个不存在的内存地址的东西。我将 n 初始化为 0 并解决了问题。谢谢!
      • @hugoblack,你在依赖副作用,你应该检查 sscanf 的结果,如果结果无效,千万不要使用n
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2016-01-19
      • 2020-09-30
      相关资源
      最近更新 更多