帮我看一下,问题在哪里?(Dynamic Array问题)

cbcool 2005-04-04 04:58:38
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type
TValue = Record
str1: string;
Int: integer;
str2: string;
str3: string;
End;
PValue = ^TValue;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
List: TList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
i, j: integer;
TreeNode, ValueNode: TTreeNode;
ArrayValue: Array Of PValue;
begin
SetLength(ArrayValue,4);
For i := 0 To 4 Do
Begin
GetMem(ArrayValue[i],SizeOf(PValue));
ArrayValue[i]^.str1 := 'aaa';
ArrayValue[i]^.str2 := 'bbb';//在这里出错,帮帮我查一下为什么?谢谢!
ArrayValue[i]^.str3 := 'ccc';
End;
IF Assigned(List) Then List.Destroy;
IF Not Assigned(ArrayValue) Then Raise Exception.Create('Null of ArrayValue');
List := TList.Create;
List.Add(ArrayValue);
ShowMessage('The ArrayValue has Add into List Item');
end;

end.

帮帮我查一下为什么?谢谢!
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbcool 2005-04-04
  • 打赏
  • 举报
回复
谢谢!
gzmhero 2005-04-04
  • 打赏
  • 举报
回复
For i := 0 To 4 Do
Begin
// GetMem(ArrayValue[i],SizeOf(PValue));
--------------------->>>>>>>>>>>>>>>
new(ArrayValue[i]);////ArrayValue[i]是一个指针
ArrayValue[i]^.str1 := 'aaa';
ArrayValue[i]^.str2 := 'bbb';
ArrayValue[i]^.str3 := 'ccc';
End;
SarahCla 2005-04-04
  • 打赏
  • 举报
回复
GetMem(ArrayValue[i],SizeOf(TValue));
不是PValue
gzmhero 2005-04-04
  • 打赏
  • 举报
回复

For i := 0 To 4 Do
Begin
GetMem(ArrayValue[i],SizeOf(PValue));/////////这里错误。
ArrayValue[i]^.str1 := 'aaa';
ArrayValue[i]^.str2 := 'bbb';
ArrayValue[i]^.str3 := 'ccc';
End;
/////////////////
sizeof(PValue)值是4,这里GetMem(ArrayValue[i],sizeof(PValue))其实给ArrayValue申请了4个字节的空间,后面赋值,到str2的时候,aaa+bbb>4,所以溢出了。
cll0320 2005-04-04
  • 打赏
  • 举报
回复
SizeOf(PValue)
应该是SizeOf(TValue)吧。
malamala 2005-04-04
  • 打赏
  • 举报
回复
改成下面的试试:
...
ArrayValue: Array Of TValue;
begin
SetLength(ArrayValue,4);
For i := 0 To 3 Do
Begin
ArrayValue[i].str1 := 'aaa';
ArrayValue[i].str2 := 'bbb';
ArrayValue[i].str3 := 'ccc';
End;
...
end;
cbcool 2005-04-04
  • 打赏
  • 举报
回复
不是,我跟了一下,在第一个循环就出错了
malamala 2005-04-04
  • 打赏
  • 举报
回复
越界了
For i := 0 To 3 Do
Cute_Rascal 2005-04-04
  • 打赏
  • 举报
回复
SetLength(ArrayValue,5);
试一下看看吧,好像是越界了。因为动态数组是0基数组。
cbcool 2005-04-04
  • 打赏
  • 举报
回复
补充一下:
 For i := 0 To 4 Do 改成 0 To 3

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧