Почему я получаю ошибку сегментации с помощью isdigit ()? - PullRequest
3 голосов
/ 23 августа 2011

Сценарий 1: Код:

int main(){
    int a = 12345678;

    if(isdigit(a)){
        printf("ok: foo\n");
    }
    else{
        printf("false: bar\n");
    }
    printf("test\n");

    return EXIT_SUCCESS;
}

Вывод:

Segmentation fault

Сценарий 2: Код:

 ...
    if(isdigit(a)){
        //printf("ok: foo\n");
    }
    else{
        //printf("false: bar\n");
    }
    printf("test\n");
 ...

Вывод:

test

и теперь последний, код:

...
int a = 1234567;
...

Вывод:

ok: foo
test

Что не так с isdigit ()?Я не понимаю!

Ответы [ 4 ]

2 голосов
/ 23 августа 2011

Это потому, что isdigit может быть определен как макрос, подобный этому

#define isdigit(c) ((map[c] & FLAG_DIGIT)==FLAG_DIGIT)

Вы вызываете isdigit с целочисленным значением, но размер массива карты составляет 256 элементов. В этом случае вы пытаетесь прочитать значение вне границ массива -> ошибка сегментации. Эта ошибка сегментации может произойти случайно. В зависимости от вашей программы или размера данных.

2 голосов
/ 23 августа 2011

Возможно, потому что компилятор оптимизирует вызов функции isdigit из кода. То есть оно не запускается.

Также обратите внимание, что isdigit ожидает символ, а не число. http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

1 голос
/ 23 августа 2011

Прежде всего, isdigit(3) проверяет, является ли символ цифрой.

Ошибка сегментации, вероятно (я уверен), возникает из-за того, что выstdio.h.

Затем вы вызываете printf, который использует переменные аргументы, не зная своего прототипа (неопределенное поведение).

1 голос
/ 23 августа 2011

Вероятно, это было оптимизировано компилятором. Поскольку ни if, ни else что-то не делают, оно было удалено, и isdigit в итоге не вызывается. Обязательно

#include <ctype.h>

Ошибка сегментации возникает, вероятно, из-за того, что вы передаете (не очень маленькое) число, когда ожидался символ. Когда вы удаляете операторы printf и компилятор оптимизирует его, вызов не будет происходить, поэтому он не завершится с ошибкой.

Обратите внимание, что заголовки могут быть фактически опущены, так как программа будет связана со стандартной библиотекой C по умолчанию, поэтому она работает. Но это не очень хорошая идея, и вы должны увидеть хотя бы предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...