场景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()有什么问题?我不明白!
答案 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)