[DUG] Sizeof record gives error

David Moorhouse (DUG) delphi at moorhouse.net.nz
Thu Aug 25 12:07:10 NZST 2011


Thanks Robo

In my mind the memory layout looks like this (attempt at ascii art follows)

TLogData
 -> LogType = 4 bytes
 - LogArgs - >  TConstArray -> length = 4 bytes
                            -> data pointer = 4 bytes

Regardless of the Length of the array, if I allocate 16 bytes the code
works fine.  If I allocate 12 (as above) it crashes.


Cheers

D


> I think your TLogData contains storage for an integer (TLogType, 4 bytes),
> and a pointer to an array (4 bytes).
>
> However, what you need is enough memory to store the entire array, not
> just
> the pointer, so you should get the size of the array to get the correct
> size.
>
> On Thu, Aug 25, 2011 at 11:40 AM, David Moorhouse (DUG) <
> delphi at moorhouse.net.nz> wrote:
>
>> I have the following code snippet
>>
>> <code>
>> type
>>  PConstArray = ^TConstArray;
>>  TConstArray = array of TVarRec;
>>
>> function CreateConstArray(const Elements: array of const): TConstArray;
>>
>> type
>>  TLogType = (ltError, ltWarn, ltInfo);
>>  PLogData = ^TLogData;
>>  TLogData = record
>>    LogType: TLogType;
>>    LogArgs: TConstArray;
>>  end;
>>
>> ....
>>
>> procedure TUserClass.Log(const LogType: TLogType; const Args: array of
>> const );
>> var
>>  LogData: PLogData;
>> begin
>>    // size of record TLogData does not work
>>    GetMem(LogData, sizeof(TLogData));
>>    LogData.LogType := LogType;
>> // blows up on next line
>>    LogData.LogArgs := CreateConstArray(Args);
>> //  ... do some other stuff with the LogData item finally calling
>> FreeMem
>> end;
>>
>> function CreateConstArray(const Elements: array of const): TConstArray;
>> var
>>  I: Integer;
>> begin
>>  SetLength(Result, Length(Elements));
>>  for I := Low(Elements) to High(Elements) do
>>    Result[I] :=  // assign a TVarRec here
>> end;
>> </code>
>>
>> The code that assigns the memory only assigns 8 bytes - and an access
>> violation ensues.  If I replace the call to "sizeof" with the number 16,
>> the code works fine.
>>
>> My understanding of dynamic arrays was that the compiler created a 4
>> byte
>> field before the first element that contained the length of the array.
>>
>> So why does the sizeof  function not reflect this ?  And why do I need
>> 16
>> bytes not 12  (4 for LogType + 4 for length of array + 4 for array
>> pointer)?
>> Also regardless of the number of items in the open array parameter, 16
>> bytes works, so it does not relate the length of the TConstArray.
>>
>> Your thoughts ?
>>
>> David
>>
>>
>>
>> _______________________________________________
>> NZ Borland Developers Group - Delphi mailing list
>> Post: delphi at delphi.org.nz
>> Admin: http://delphi.org.nz/mailman/listinfo/delphi
>> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject:
>> unsubscribe
>>
> _______________________________________________
> NZ Borland Developers Group - Delphi mailing list
> Post: delphi at delphi.org.nz
> Admin: http://delphi.org.nz/mailman/listinfo/delphi
> Unsubscribe: send an email to delphi-request at delphi.org.nz with Subject:
> unsubscribe





More information about the Delphi mailing list