Инициализация стандартных динамических массивов в Delphi
От: Khimik  
Дата: 13.05.22 03:08
Оценка:
Мне пришла в голову необычная мысль, может я туплю, но проясните пожалуйста.
Предположим, у нас есть такой код:

procedure Test;
var
  arr:array of integer;
  val:byte;
begin
  setlength(add,5);
  arr[0]:=val;
end;


Этот код неправильный, поскольку переменная val не инициализирована и при присвоении во второй строке её значение может оказаться каким угодно (в зависимости от чего, что находилось до этого в памяти, которая была выделена под стек). Но тогда возникает вопрос — а как инициируются динамические массивы? Через setlength? Но ведь процедура setlength использует данные о предыдущем состоянии массива: может быть, сначала надо освободить старую память, потом выделить новую, и ещё копировать старые элементы в новую память. Если переменная arr перед setlength не была инициализирована, не может ли получиться, что она будет указывать на какой-то случайный участок в памяти, которую Delphi воспримет как уже существующий массив? Может быть, надо перед setlength прописать arr:=nil?
Вообще поясните, что такое стандартные динамические массивы в Delphi. Это указатель на участок памяти, в котором первые 4 байта заняты интегером, обозначающим число элементов в массиве? Ещё вопрос — если в процедуре через var динамический массив передаётся как параметр, происходит передача указателя или указателя на указатель? Я имею в виду такой код:

procedure Proc(var arr:array of integer);
begin
  arr[0]:=5;  //Ошибки не возникнет?  
end;

var
  arr1:array of integer;
begin
  arr1:=nil;
  setlength(arr1,5);
  Proc(arr1);
end;
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.