急,关于设置动态数组长度的问题。 (50分)

  • 主题发起人 主题发起人 silverwolf
  • 开始时间 开始时间
S

silverwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
type
PArray=^Data;
Data=array of integer;
var
MyList:Tlist;
aData:PArray;
begin
MyList:=TList.Create;
New(aData);
SetLength(aData^,10);
aData^[11]:=-5
------------->这句话为什么不出错??我只开了0..9的数组空间;
end;

如果在本程序中,以后再访问这个aData^数据是否会出错。
 
老兄,看看这里,我以前问的,跟你的一样.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1027339
 
jbas,看了你过去的帖子,谢谢。如果我是合法访问,应该不可能影响到其它的数据吧,
如果还是有危险,那么如何合理的设计一个数据结构满足我上面的要求呢?
 
动态数组是不检测上下边界的。所以系统不会报错。
你这样做到破坏原来的内存的数据,你再次去读这个区域的数据时候,可能就不是你存进去的那个值了。
 
合法访问也会破坏???
 
这不叫合法访问,你访问的内存区域不在你的程序申请内存区域中,所以应该叫非法访问。
非法访问别的内存区域后果就是引起程序不稳定,严重者会让系统崩溃。
 
这是因为指针越界访问的使用问题,Delphi能编译过去,小例子:
procedure TForm1.Button1Click(Sender: TObject);
var
P:^Integer;
I:Integer;
begin
I:=10;
P:=@I;
Inc(P);//指向下一个地址;
Edit1.Text:=IntToStr(P^);//取得下一位地址的内容;
end;
 
new()通常只用来分配已知长度的内存空间
你的指针指向的是一个动态数组,长度不固定。
你调用new(adata)本身就是一个错误。
为动态数组分配通常用setlengty(adata,长度)
而且你只分配 SetLength(aData^,10)
aData^[11] 已超出你的分配范围,这还叫合法访问?
 
关于动态数组,我总是这样用的:
inc(k);
setlength(arr,k);
arr[k-1]:=你的数据.

or
setlength(arr,10);
for i:=0 to 9 do
begin
arr:=你的数据.;
end;
 
谢谢诸位:
to :xiao_ping,
aData^[11]当然不是合法访问,但如果只限制在0..9中呢?看了你的解答,有点迷惑
那new(aData)到底分配出怎样的空间给我们呢?

to 枫,
我的合法访问是值限制在0..9的下标中。
 
我的意思是,你访问0。。9是合法访问,但11这个元素,系统并没有为它分配内存,所以你访问
11这个元素就是非法访问。
 
重新设置了数据结构,不用原来的,动态数组太危险了,不小心越界的话,以后所有的
信息都可能出错。
谁能谈谈xiao_ping说到的new的问题:
new是否能分配一个未知长度的内存空间,如果不能那么我的程序中new(aData)
到底分配出怎样的空间给我们呢?
附加说一下:对aData^[11]的访问只是原来测试的,肯定是非法的。
上面说说的合法访问是指在〔0..9]中。
 
new(aData) --> 分配一个指针所占用的空间, 也就是4字节。因为你的adata是个指针
 
按Pearl的说法,是否可以说:new能分配一个未知长度的内存空间??
 
关于new,一般它分配一个空间,然后将这个空间的地址给这个指针变量。
当指针变量所指的类型是确定长度的,那么分配的空间大小也确定了,此时,这个空间就
存放数据,但是如果数据类型是不确定长度的,那么分配的空间是四位,它存储的使地址。
 
to silverwolf:
显然不能。 new只能分配定长的内存给变量。
而上例中的aData是一个指向动态数组的指针。 简单说, 它是一个指向另一个指针的指针。
它指向的内存空间是定长的(另一个指针----4字节), 所以能用new(aData)给它分配内存。
 
后退
顶部