SQLite源代码中的指针边界和指针算法

时间:2015-08-12 23:49:24

标签: c sqlite pointers

当我从387的第shell.c行开始遇到此函数时,我正在浏览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'被取消引用,不是这个被破坏/非法的内存访问,因为它超出指针的范围,或者是否有一些指针算法在幕后停止发生这种情况?

1 个答案:

答案 0 :(得分:1)

不,C字符串应该以null结尾。

如果传递的字符串只包含-+字符,z指针将在递增后指向空终止符,IsDigit(*z)将等效到IsDigit(0),评估为false并返回0。