动态数组的下限 ( 积分: 10 )

  • 主题发起人 主题发起人 JebelStream
  • 开始时间 开始时间
J

JebelStream

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;

以上代码不但可以通过编译,而且执行时也不报错,有点不理解,为什么?
 
procedure TForm1.Button1Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;

以上代码不但可以通过编译,而且执行时也不报错,有点不理解,为什么?
 
运气好而已.
delphi向windows申请的可是一大块内存然后用自己内部的内存管理来分配这些给用户使用.
你只不过碰巧写到了delphi申请但未分配给用户使用的那块内存而已. 但对windows来说这个写操作是合法的.
 
兄弟,你只为数组申请了100个记录空间,怎么能访问它的第190个元素呢?要想访问,就申请200个好了!
 
多运行几次就会出错了。。。。你试试看?
 
abc[150]的地址显然是空的
你再申请一个数组就不行了...
 
呵,,,真是奇怪了。
在我的机器里就是能运行,还不报错,我同时做了好几个这样的过程都没问题。
你们也到自己机器上去试试吧。看有没有问题。
procedure TForm1.Button1Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;
procedure TForm1.Button4Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));

end;

procedure TForm1.Button5Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;

procedure TForm1.Button6Click(Sender: TObject);
var
abc:array of integer;
begin
setlength(abc,100);
abc[190]:=50;
showmessage(IntToStr(abc[190]));
end;
全部OK 真搞不明白是怎么回事儿?

我的机器 IBM T43 XP DELPHI6 我之所以贴出这个问题来就是因为这个问题太奇怪了。
 
我这里P-M1.5 XP+SP2 D6 运行3次以上就报内存错误了
 
我也不知道为什么..?? 哪位老大给解释解释..
如果说是delphi向windows申请内存, 而且是很大的一块,那么编译成exe, 单独运行呢??
是不是只有单独的exe申请空间. 可是依然没有错误. 为什么?
 
delphi好象是有个问题,申请10个空间,可以用第11个,到现在也没有搞清楚,学习.
 
如果打开 range check 就会报错了
不开range check 而不出错不能证明永远不出错,运气好而已
 
先搞清楚wndows如何管理、使用内存吧。
打个比方,就像10个抽屉(内存单元),你告诉主人要用2个(申请内存空间),于是主人将2个抽屉清空给你用(为你分配内存),你可以往里面装东西(存储)或是拆掉抽屉(释放内存)。但你不止用了2个,还打开了第三个,运气好的话里面刚好是空的或者放着些无关紧要的东西,这时你爱用就用吧,一般主人也懒得管了(还有不一般的情况,如你想把第三个抽屉拆掉),但也有可能里面放着炸弹之类的东西(如第三个抽屉对应的内存尚未分配,处于不可用状态,或属性为不可读写),这是你就要Game Over了。

这个例子不严紧,但大概意思就是这样。
不要动不动就说delphi怎么怎么样,先考率一下是不是自己错了,
其实动态数组不过是指针罢了,
C, C++的指针会发生这种情况,所以说指针是危险的
不过是否危险完全在于你是否会正确使用它
 
只要访问的虚拟内存地址对应的页面已经提交, 并且保护属性允许读写, 则读写本身不会导致出错, 如果正好所访问的内存, 程序的其他地方还未用到, 则也不会影响程序后面的运行~ [:D]
 
工程选项里有“范围检查”,打勾,性能稍减.
 
后退
顶部