在数组(字符串)的边界之外读取是否可以接受?
我研究了一点 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。否则,在索引空字符时会导致异常。