动态数组赋值后调用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




