首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >分段错误,地址越界

分段错误,地址越界
EN

Stack Overflow用户
提问于 2011-07-24 17:48:14
回答 2查看 10.5K关注 0票数 1

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

我得到的问题是,当你第一次启动程序时,如果你输入空格作为输入,它会得到一个分段错误。如果你放入其他东西,它运行得很好。如果你在这之后只输入空格,它也会运行的很好。

下面是该函数的一个片段:

代码语言:javascript
代码运行次数:0
运行
复制
#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上运行MinGW和MSYS。当我通过GDB运行它时,我得到:

代码语言:javascript
代码运行次数:0
运行
复制
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

...but我不熟悉GDB,所以我不知道还需要检查什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-24 17:56:38

打印n。我怀疑它会得到一个真正意想不到的值(也许是负值?尽管这不太可能)。

票数 1
EN

Stack Overflow用户

发布于 2011-07-24 18:05:23

sscanf应该返回匹配项的数量,如果不能匹配任何项,它将返回0,n将保留以前的值,最后使用n递增指针。

在使用n之前检查sscanf返回的内容,如果它返回0,就不要使用它

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6806109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档