在数组(字符串)的边界之外读取是否可以接受?

我研究了一点 Delphi 源代码,这对我来说有点难看(在 system.pas 中,程序 ValLong):

while True do
begin
  case S[I] of
    '0'..'9': Dig := Ord(S[I]) - Ord('0');
  else
    Break;
  end;
  if (Result < 0) or (Result > (High(Integer) div 10)) then
    Break;
  Result := Result*10 + Dig;
  Inc(I);
  Empty := False;
end;

如您所见,退出循环唯一方法是在 S(字符串)的边界之外读取。我错过了什么,这是正确的做法吗?

回答

Unicode 字符串、AnsiString 和 WideString 类型总是以空字符结尾。

从内部数据格式-长字符串类型:

字符串内存块末尾的 NULL 字符由编译器和内置字符串处理例程自动维护。这使得可以将字符串直接类型转换为以空字符结尾的字符串。

因此,可以安全地依赖这些类型为空终止的事实。问题中的代码示例没问题。

注意:我假设范围检查已关闭,因为此代码来自 RTL。否则,在索引空字符时会导致异常。


以上是在数组(字符串)的边界之外读取是否可以接受?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>