Итак, я всегда слышал, что поля классов (на основе кучи) были инициализированы, но переменные на основе стека не были. Я также слышал, что элементы записи (также основанные на стеках) также не были инициализированы. Компилятор предупреждает, что локальные переменные не инициализированы ([Предупреждение DCC] W1036 Переменная "x", возможно, не была инициализирована), но не предупреждает о членах записи. Поэтому я решил провести тест.
Я всегда получаю 0 от целых чисел и false от Booleans для всех участников записи.
Я попытался включить и выключить различные параметры компилятора (отладка, оптимизация и т.д.), но не было никакой разницы. Все мои участники записи инициализируются.
Что мне не хватает? Я на Delphi 2009 Update 2.
program TestInitialization;
{$APPTYPE CONSOLE}
uses
  SysUtils;
type
  TR = Record
  Public
    i1, i2, i3, i4, i5: Integer;
    a: array[0..10] of Integer;
    b1, b2, b3, b4, b5: Boolean;
    s: String;
  End;
var
  r: TR;
  x: Integer;
begin
  try
    WriteLn('Testing record. . . .');
    WriteLn('i1 ',R.i1);
    WriteLn('i2 ',R.i2);
    WriteLn('i3 ',R.i3);
    WriteLn('i4 ',R.i4);
    WriteLn('i5 ',R.i5);
    Writeln( ',R.s);
    Writeln('Booleans: ', R.b1, ' ', R.b2, ' ', R.b3, ' ', R.b4, ' ', R.b5);
    Writeln('Array ');
    for x := 0 to 10 do
      Write(R.a[x], ' ');
    WriteLn;
    WriteLn('Done . . . .');
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  ReadLn;
end.
Вывод:
Testing record. . . . i1 0 i2 0 i3 0 i4 0 i5 0 S Booleans: FALSE FALSE FALSE FALSE FALSE Array 0 0 0 0 0 0 0 0 0 0 0 Done . . . .
