求教几个关于数组的问题:) ( 积分: 120 )

  • 主题发起人 主题发起人 blackpearl
  • 开始时间 开始时间
B

blackpearl

Unregistered / Unconfirmed
GUEST, unregistred user!
1.我在一段程序里定义了一个静态数组为arrays:array[1..1000] of string;然后用I:=1..1000逐渐增大的方式,往该数组里赋值,但由于不小心,I的值增加到远远超过1000了(我的那段程序里,I已经超过5000了),程序竟然没出错,各位高手知道这是为什么吗?--但后来我写了另外一小段代码检验,数组元素个数是不能超过数组界限的呀:(
2.动态数组会自动释放内存空间吗?如果,for i:=0 to 100 do
begin
setlength(arraytest,3000+i);
for j:=0 to 2999 do
arraytest[j]:=j;
end;
是不是当I每次循环,到setlength语句后,前面分配给arraytest的空间都自动释放了?
3.还有,如果我的程序有很多个函数组成,每个函数实现一个功能,彼此不相关,每个函数的代码变量中有静态、动态数组,那么当执行完‘A’功能换执行‘B’功能的时候,‘A’函数里的这些数组内存空间会自动释放吗?
4.最后,想了解一下内存地址个数怎么算呀?
……拜托了
 
1.我在一段程序里定义了一个静态数组为arrays:array[1..1000] of string;然后用I:=1..1000逐渐增大的方式,往该数组里赋值,但由于不小心,I的值增加到远远超过1000了(我的那段程序里,I已经超过5000了),程序竟然没出错,各位高手知道这是为什么吗?--但后来我写了另外一小段代码检验,数组元素个数是不能超过数组界限的呀:(
2.动态数组会自动释放内存空间吗?如果,for i:=0 to 100 do
begin
setlength(arraytest,3000+i);
for j:=0 to 2999 do
arraytest[j]:=j;
end;
是不是当I每次循环,到setlength语句后,前面分配给arraytest的空间都自动释放了?
3.还有,如果我的程序有很多个函数组成,每个函数实现一个功能,彼此不相关,每个函数的代码变量中有静态、动态数组,那么当执行完‘A’功能换执行‘B’功能的时候,‘A’函数里的这些数组内存空间会自动释放吗?
4.最后,想了解一下内存地址个数怎么算呀?
……拜托了
 
1.不太可能,越界就会出错的.很奇怪
2.会,退出作用域后,动态数组就释放了.如果要手工释放,可以写一句
arraytext := nil;
即可.
setlength只是增加了它的大小,还没出作用域,它不会释放
3.会,只要退出函数范围,静态数组就释放了.这部分内存就被回收了.
4.内存地址没什么"个数"把?不明白你的 问题.
 
被楼上抢先了~~~
 
高手如云啊
 
1.不对,越界不会出错的,只是数据有可能不对,我今天还刚刚碰到的呢
var
cType: String;
CarType: array [0..4] of String;
begin
。。。
当时的情况很奇怪,我edt.text := CarType[5];的时候竟然惊奇的发现这个值其实是cType,[:(!][?]
 
1.我也是觉得越界就会出问题的,刚才自己测试的时候,只要一越界,就立马出问题了,但今天真的发现我那程序里竟然不出错,很怪异^_^
2.也就是说像上面那段程序,分配的内存空间在慢慢增大,而不是说共分配了3000×100以上的内存空间对吧?
3.只要退出作用域,静态、动态数组就都自动释放了,对吧?
4.上次比较变态,给程序里的15个array[1..50000] of string分配空间,而每个只赋前100个元素的值,结果一执行程序马上跳出错误,所以我觉得应该有空间或者个数限制的吧?(给一个变量分配array[1..50000]就没有问题的^_^)
……比较菜,呵呵
 
数组下标用变量表示的时候不会提示的,你看看下面的
var
cType: String;
Car: array [0..1] of string;
i: Integer;
begin
Car[0] := '33';
Car[1] := '44';
cType := 'Just Here';
i := 2;
edt1.Text := Car;
end;
你会发现edt里的内容是'Just Here',其实就是自动在内存中按它所理解的下标取值了
 
我测试过,会报错不知道上面为什么说不报错?
procedure TForm1.Button1Click(Sender: TObject);
var
a: array [0..2] of string;
I: Integer;
begin
I := 3;
a[0] := 'abc';
a[1] := '123';
a[2] := '321';
ShowMessage(a);
end;
 
2.也就是说像上面那段程序,分配的内存空间在慢慢增大,而不是说共分配了3000×100以上的内存空间对吧?//实际分配了3100个长度单位
3.只要退出作用域,静态、动态数组就都自动释放了,对吧?//只有动态数组才是自动释放
 
好象用变量的话真的不会出错
procedure TForm1.Button1Click(Sender: TObject);
var
s:array[1..10] of string;
i,j:integer;
begin
for i:=1 to 10 do
s:=inttostr(i);
j:=11 ;
while j<20 do
begin
s[j]:=inttostr(j);
inc(j);
end;
for i:=1 to 19 do
showmessage(s);
end;
输出的是1..19,但最后出了个错[:)]
 
其实,内存中可能正好那个地方存有数据,所以,你能访问倒.如果希望不越界,选择Project->Option->Complier->Runtime Error->Range Checking就可以发现这样的错误了.
 
后退
顶部