You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

动态数组赋值后调用Length触发EAccessViolation访问违规问题咨询

为什么Delphi动态数组赋值后调用Length会触发访问违规?

嘿,这个问题我太熟了!咱们来拆解一下你遇到的问题:

核心原因:动态数组未初始化

你定义的myArray动态数组,在Delphi里,动态数组默认处于nil状态——相当于它还没有被分配任何内存空间,就像一个空的、没有尺寸的容器。你直接给myArray[0]myArray[1]这类索引位置赋值,本质上是在访问一块不存在的内存,这就直接触发了EAccessViolation访问违规错误。

编译器给出的警告Local variable "myArray" does not seem to be initialized其实已经把问题点出来了,只是你可能没意识到它的严重性😉

怎么解决?

你需要先给动态数组分配内存空间,用SetLength函数指定数组的长度,之后再给元素赋值。修改后的代码如下:

program LengthOfArray;
uses sysutils;
procedure Main();
var myArray: array of String;
begin
  // 先初始化数组,指定长度为3
  SetLength(myArray, 3);
  myArray[0] := 'hi';
  myArray[1] := 'bye';
  myArray[2] := 'hello';
  WriteLn('array length is: ', Length(myArray));
end;
begin
  Main();
end.

补充说明:Length函数的行为

当动态数组是nil时,Length(myArray)会返回0,但这时候你不能通过索引访问任何元素——因为数组根本没有对应的内存块。只有调用SetLength之后,数组才会被分配对应长度的内存,这时候索引访问和Length函数才能正常工作。

内容的提问来源于stack exchange,提问作者Chris Choi

火山引擎 最新活动