c - 段错误,地址越界

标签 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;
}

我在使用 MSYS 运行 MinGW 的 Windows 上。 当我通过 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,所以我不知道还有什么要检查

最佳答案

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

,则不要使用它

关于c - 段错误,地址越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6806109/

相关文章:

c++ - 如何扫描 N 个字符串(使用结构)然后反向输出该字符串列表?

c - 使用条件运算符时变量值如何变化?

c - 总线错误和段错误取决于输入的值

c - C/Linux 指针到指针的段错误

c - 如何使用柠檬处理带有变量的表达式

C 删除二叉树后死循环

c - Raspberry pi 上的 I2C_SLAVE 和 I2C_RDWR 返回值错误

C - 将参数未知的函数传递给另一个函数,并调用它

c - 在 C 中使用 pthread_join 时出现段错误

c - 伪代码中的红黑树插入和修复有问题