C 为什么isdigit()会出现分段错误?

C 为什么isdigit()会出现分段错误?,c,C,情景1: 代码: 输出: Segmentation fault test ok: foo test 情景2: 代码: 输出: Segmentation fault test ok: foo test 现在是最后一个代码: ... int a = 1234567; ... 输出: Segmentation fault test ok: foo test isdigit()有什么问题吗?我不明白 可能是因为编译器优化了来自代码的isdigit函数调用。那就是它不运行它 还要注意,

情景1: 代码:

输出:

Segmentation fault
test
ok: foo
test
情景2: 代码:

输出:

Segmentation fault
test
ok: foo
test
现在是最后一个代码:

...
int a = 1234567;
...
输出:

Segmentation fault
test
ok: foo
test

isdigit()有什么问题吗?我不明白

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


还要注意,isdigit需要的是字符,而不是数字

这可能是由编译器优化的。由于if或else都不执行某些操作,因此它被删除,而
isdigit
最终没有被调用。一定要

#include <ctype.h>
#包括

分割错误可能是因为您传递的是一个(不是很小的)数字,而预期的是一个字符。当您删除printf语句并由编译器对其进行优化时,调用不会发生,因此不会失败

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

首先,检查字符是否是数字

分段错误(我是肯定的)可能是因为您没有包含
stdio.h


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

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

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

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

我不会忘记#include:)我可以编译这个小程序而不会出错。@krzym:我不能。有些编译器比其他编译器更挑剔,但应该包括在内。啊…好的。现在运行时没有分段错误:)崩溃不是因为缺少任何包含文件。我也不明白你的最后一点。如果C编译器/链接器找不到函数,它会报告一个错误。@user357320,不,它不会。如果配置正确,可能是一个警告,它不是关于函数的定义,而是关于它的声明。