当我在 shell.c
中从 387
行开始看到这个函数时,我正在浏览 SQLite 源代码。
源代码:https://www.sqlite.org/download.html
有问题的功能:
/*
** Determines if a string is a number of not.
*/
static int isNumber(const char *z, int *realnum){
if( *z=='-' || *z=='+' ) z++;
if( !IsDigit(*z) ){
return 0;
}
z++;
if( realnum ) *realnum = 0;
while( IsDigit(*z) ){ z++; }
if( *z=='.' ){
z++;
if( !IsDigit(*z) ) return 0;
while( IsDigit(*z) ){ z++; }
if( realnum ) *realnum = 1;
}
if( *z=='e' || *z=='E' ){
z++;
if( *z=='+' || *z=='-' ) z++;
if( !IsDigit(*z) ) return 0;
while( IsDigit(*z) ){ z++; }
if( realnum ) *realnum = 1;
}
return *z==0;
}
注意:IsDigit 是一个宏,它将一个无符号字符输入到 ctype 中定义的 isdigit 中。
#define IsDigit(X) isdigit((unsigned char)X)
函数和指针的使用对我来说很有意义,但是,根据我的理解,前两行让我相信它们可能使用不当。
他们使用指针算法来随机排列字符串。
if( *z=='-' || *z=='+' ) z++;
如果指针第一个位置的字符是'-'或'+',则将指针移到一个位置上。但是,如果传递给函数的字符串只有一个字符恰好是“-”或“+”符号,这似乎没有考虑在内。
if( !IsDigit(*z) ){
当“z”被取消引用时,这是否是损坏的/非法的内存访问,因为它超出了指针的范围,或者是否在幕后使用指针算法阻止了这种情况的发生?
最佳答案
不,C 字符串应该以 null 结尾。
如果传递的字符串只包含-
或+
字符,则z
指针自增后会指向空终止符,并且 IsDigit(*z)
将等效于 IsDigit(0)
,其计算结果为 false
并返回 0。
关于c - SQLite 源代码中的指针边界和指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31977288/