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

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

问题是后面重新分配的时候是在原来的基础上新增呢还是所有内存重新分配
如果是后者,那么重新分配后,前面的元素的内存是不是不确定的呢?从而导致前面的元素数据错乱了
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
如果后面有足够空间,会接着分配,如果空间不够,会重新开辟一块区域
线性表C++语言实现,包含《数据结构算法与应用-C++语言描述》练习题。 template class LinearList { public: LinearList(int MaxListSize = 10);//构造函数 LinearList(LinearList& L);//复制构造函数 ~LinearList() { delete[] element; }//析构函数 bool IsEmpty() const { return length == 0; }//判断线性表是否为空 int Length() const { return length; }//返回数组长度 void SetLength(int SetLength) { length = SetLength; }//设置数组长度 int MaxSize_ret() const { return MaxSize; }//返回数组最大长度 int Current_ret(void) const { return current; } bool Find(int k, T& x);//返回第k个元素至x中 int Search(const T& x) const;//返回x所在位置 LinearList& Delete(int k, T& x);//删除第k个元素并将它返回至x中 LinearList& Insert(int k, const T& x);//在第k个元素之后插入x LinearList& Insert(const T& x);//在表尾插入x void Output(ostream& out) const; void Self_adaption_LinearList_Size(void); void Reverse(void); bool Half(void); LinearList& Alternate(LinearList& A, LinearList& B); LinearList& Merge(LinearList& A, LinearList& B); LinearList& Merge_1(LinearList& A, LinearList& B); void Split(LinearList& A, LinearList& B); LinearList& Sort(void); /*关于前移和后移*/ void Reset(void) { current = 1; } //置current为0 T Current(void) { return element[current-1]; }//返回当前元素 bool End(void);//当且仅当当前元素为表的最后一个元素时,返回true bool Front(void);//当且仅当当前元素为表的第一个元素时,返回true void Next(void);//移动current至表中的下一个元素,如果操作失败则引发一个异常 void Previous(void);//移动current至表中的前一个元素,如果操作失败则引发一个异常 private: int length;//线性表长度 int MaxSize;//线性表最大可容纳的长度 int current;//记录线性表当前的位置 T* element;//一维动态数组 };

16,748

社区成员

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

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