SetLength设置动态数组长度的问题

一如当初 2012-08-02 08:31:13
begin
SetLength(X, 1);
……
SetLength(X, 2);
……
SetLength(X, 3);
end;

问题是后面重新分配的时候是在原来的基础上新增呢还是所有内存重新分配
如果是后者,那么重新分配后,前面的元素的内存是不是不确定的呢?从而导致前面的元素数据错乱了
...全文
243 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一如当初 2012-08-02
  • 打赏
  • 举报
回复
了解了,谢谢大家
蓝色光芒 2012-08-02
  • 打赏
  • 举报
回复
是的,原Index<NewCount的内容肯定是原内容
因为有可能整个区域都移动了,所以指针是不确定的,注意是有可能,因此指针要重新赋值,才能保证程序准确无误
kaikai_kk 2012-08-02
  • 打赏
  • 举报
回复
增加是重新分配, 前面的内容会移动新的空间里面,所以地址会变的; 变小不会
一如当初 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SetLength好比Realloc,如果空间变大,会复制前面的的内容,如果空间变小,删除后面的内容。
但是前面内容的指针就不能确定了
如:
var
piList : array of integer;
P : PInteger;
begin
SetLength(piList , 1);
P := @piList[0];
P^ := 0; //这个指针没……
[/Quote]
那就是说指针是不确定的,但是内容还是相同的?
比如你这个代码,申请了100个元素后,P的指针变了,但是内容没有变吧,因为你说会复制前面元素的内容
蓝色光芒 2012-08-02
  • 打赏
  • 举报
回复
SetLength好比Realloc,如果空间变大,会复制前面的的内容,如果空间变小,删除后面的内容。
但是前面内容的指针就不能确定了
如:
var
piList : array of integer;
P : PInteger;
begin
SetLength(piList , 1);
P := @piList[0];
P^ := 0; //这个指针没问题
SetLength(piList , 100);
P^ := 0; //这个指针就不确定,需要重新给指针赋值

bdmh 2012-08-02
  • 打赏
  • 举报
回复
如果后面有足够空间,会接着分配,如果空间不够,会重新开辟一块区域

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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