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

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

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

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

Сообщение bloodlines » 27.10.2009 17:20:53

В одном из своих проектов решил использовать динамические массивы. Возникло несколько вопросов. В примере отслеживаю значение переменной 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 поэтому и пишу в эту ветку.
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение Mr.Smart » 27.10.2009 17:33:25

Динамический массив это указатель на структуру в памяти и размер в 32 битной систему будет равен всегда 4 :wink:
Ошибка возникает потому, что вы в переменную ai1 заносите значение #0, а это указатель. Соответственно при обращение к указателю со значением nil возникает ошибка.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение VirtUX » 27.10.2009 17:36:18

Не понял для чего осуществляется инициализация памяти
Код: Выделить всё
FillChar(a1, SizeOf(a1), #0);
Если ее убрать, то ошибок никаких не будет.
a1 в отличии от a - это адрес в куче, где создается динамомассив процедурой
Код: Выделить всё
SetLength(a1,10);
. А следовательно и равняется 4-м байтам как и любая переменная, хранящая адрес.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

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

Сообщение bloodlines » 27.10.2009 17:47:16

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

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

Сообщение VirtUX » 27.10.2009 17:59:43

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


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru