我定义了PClassData指向结构体TClassData。
type
  PClassData = ^TClassData;
  TClassData = packed record
    ID: integer;
  end;然后我在程序中静态定义能正常运行:
var
  aa: array [0..10] of PClassData;
begin
  aa[1].ID := 1;
end;但是改为动态定义,一运行就出错了:
var
  aa: array of PClassData;
begin
  setlength(aa, 10);
  aa[1].ID := 1;
end;
请问得怎么办才能动态分配aa的长度呢?

解决方案 »

  1.   

    无论静态还是动态,必须先new
    静态的:
    for i := 0 to 9 do
    begin
      new(aa[i]); //= new(TClassData)
    end;
    动态更是如此:
    先申请可以装载10个元素的空间
      

  2.   

    type
      PClassData = ^TClassData;
      TClassData = packed record
        ID: integer;
      end;procedure TForm1.Button1Click(Sender: TObject);
    var
      // 静态数组
      ClassData: array[0..1] of PClassData;
      I: Integer;
    begin
      for I := 0 to 1 do
      begin
        // 分配内存空间
        GetMem(ClassData[I], Sizeof(TClassData));    // 使用...
        ClassData[I].ID := I + 100;
        ShowMessage(IntToStr(ClassData[I].ID));    // 释放内存空间
        FreeMem(ClassData[I]);
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      // 动态数组
      ClassData: array of PClassData;
      I: Integer;
    begin
      // 分配
      SetLength(ClassData, 2);
      for I := 0 to 1 do
      begin
        // 分配内存空间
        GetMem(ClassData[I], Sizeof(TClassData));    // 使用...
        ClassData[I].ID := I + 100;
        ShowMessage(IntToStr(ClassData[I].ID));    // 释放内存空间
        FreeMem(ClassData[I]);
      end;
      // 释放
      ClassData := nil;
    end;