为什么我用isdigit()得到分段错误?

时间:2011-08-23 18:01:51

标签: c

场景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 个答案:

答案 0 :(得分:2)

可能是因为编译器优化了代码中的isdigit函数调用。那就是它没有运行它。

另请注意,isdigit需要一个字符,而不是一个数字。 http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

答案 1 :(得分:2)

这是因为isdigit可以像这样定义为宏

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

使用整数值调用isdigit,但map数组大小为256个元素。在这种情况下,您尝试读取数组边界之外的值 - >分段故障。该分段错误可以随机发生。取决于您的程序或数据大小。

答案 2 :(得分:1)

这可能是由编译器优化的。因为if或else都没有做某事,所以它被移除了,而isdigit最终没有被调用。一定要

#include <ctype.h>

分段错误可能来自这样一个事实:当你预期一个角色时,你传递了一个(不是那么小)的数字。当您删除printf语句并且编译器对其进行优化时,调用将不会发生,因此不会失败。

请注意,标题实际上可以省略,因为默认情况下程序将与标准C库链接,因此它可以正常工作。但这不是一个好主意,你应该至少看到一个警告。

答案 3 :(得分:1)

首先,isdigit(3)会检查字符是否为数字。

分段错误可能(我是肯定的)因为你没有包括stdio.h而发生。

然后你调用printf使用变量参数而不知道它的原型(未定义的行为)。