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

标签 c sqlite pointers

当我在 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/

相关文章:

使用 Getchar 时清除缓冲区(必须有更好的方法!)

c程序需要找错吗?

python - 使用 sqlite 的 FTS 片段功能处理 html 转义

c++ - 双免腐败

c++ - c++内存分配问题

c - 我应该将参数存储类说明符放在函数定义中还是同时放在声明和定义中?

c++ - 将 unsigned char(BYTE) 数组转换为 const t_wchar* (LPCWSTR)

sqlite - 如何将 SQLite 导出为 JSON?

sqlite - SQLite DB 的 MIDP Java 实现

c++ - 指向可以更改指针的对象的智能指针