ошибка сегментации, адрес за пределами - PullRequest
1 голос
/ 24 июля 2011

Я пишу функцию, которая принимает строку ввода от пользователя, пока не будет нажата новая строка, затем анализирует строку в каждом слове и помещает их в массив.

Проблема, которую я получаю, заключается в том, что при первом запуске программы, если вы вводите пробел в качестве ввода, она получает ошибку сегментации. Если вы вставите что-нибудь еще, все будет хорошо. Затем, если после этого вы введете только пробел, он тоже будет работать нормально.

Вот фрагмент функции:

#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, я получаю:

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 ]

4 голосов
/ 24 июля 2011

sscanf должен вернуть количество совпадающих элементов, если он не может ничего сопоставить, он вернет 0 и n останется с тем, что было раньше, и вы в конечном итоге будете использовать n для увеличения указателя.
Проверьте, что возвращает sscanf перед использованием n, и не используйте его, если вернет 0

1 голос
/ 24 июля 2011

Печать n.Я подозреваю, что он получает действительно неожиданное значение (возможно, отрицательное? Хотя это маловероятно).

...