分段错误,地址超出范围

时间:2011-07-24 09:48:14

标签: c pointers segmentation-fault

我正在编写一个函数,它接受来自用户的一串输入,直到命中换行,然后将字符串解析为每个单词并将它们放入数组中。

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

以下是该功能的片段:

#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,所以我不知道还有什么要检查

2 个答案:

答案 0 :(得分:4)

sscanf应该返回匹配项的数量,如果它不能匹配,它将返回0并且n将保留它之前的内容,并且最终使用n来增加指针。<登记/> 在使用n之前检查sscanf返回的内容,如果返回0

则不要使用它

答案 1 :(得分:1)

打印n。我怀疑它有一个非常意外的值(可能是负面的?虽然这不太可能)。