Вопросы по работе с динамическими массивами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Вопросы по работе с динамическими массивами

Сообщение bloodlines »

В одном из своих проектов решил использовать динамические массивы. Возникло несколько вопросов. В примере отслеживаю значение переменной s

Код: Выделить всё

procedure test;
 var
  a:array[0..9] of byte;
  a1:array of byte;
  ai:array[0..9] of integer;
  ai1:array of integer;
  s:integer;
begin
  s:=0;                                              // s = 0
  SetLength(a1,10);
  s:=SizeOf(a);                                  // s = 10   
  s:=SizeOf(a1);                                // s = 4 
  FillChar(a1, SizeOf(a1), #0);
  s:=SizeOf(a1);                                // s = 4
  SetLength(ai1,10);
  s:=SizeOf(ai);                                // s = 40 
  s:=SizeOf(ai1);                              // s = 4
  FillChar(ai1, SizeOf(ai1), #0);
  s:=SizeOf(ai1);                             // s = 4
  ai1[1]:=1;                                    // возникает ошибка 'External: SIGSEGV'
end;   


Собственно говоря интересует:
1. Почему разные размеры у переменных a и a1, ai и ai1?
2. Почему размеры переменных a1 и ai1 совпадают?
3. Почему вылезает ошибка?

Я наверное неправильно создаю динамические массивы?

Пример запускаю в лазаре (см. подпись), но по моему вопросы касаются только FPC поэтому и пишу в эту ветку.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Динамический массив это указатель на структуру в памяти и размер в 32 битной систему будет равен всегда 4 :wink:
Ошибка возникает потому, что вы в переменную ai1 заносите значение #0, а это указатель. Соответственно при обращение к указателю со значением nil возникает ошибка.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Не понял для чего осуществляется инициализация памяти

Код: Выделить всё

FillChar(a1, SizeOf(a1), #0);
Если ее убрать, то ошибок никаких не будет.
a1 в отличии от a - это адрес в куче, где создается динамомассив процедурой

Код: Выделить всё

SetLength(a1,10);
. А следовательно и равняется 4-м байтам как и любая переменная, хранящая адрес.
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

Большое спасибо!
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Здесь очень хорошо описано про массивы динамики и статики.
Ответить