[fpc-pascal] getmem
Howard Page-Clark
hdpc at talktalk.net
Tue May 24 17:58:12 CEST 2011
On 24/5/11 4:22, Luis Fernando Del Aguila Mejía wrote:
> I know that you can use dynamic arrays (array of). Is better.
> But this does not understand and confuse me.
> Why to create an array of 3 elements (ANSIString) with GetMem, I have to
> put a size of 15 bytes (5*3) and not 12 bytes (4*3).?
> The program works with 15 bytes, but do not understand why not work with
> 12 bytes.
> Thanks.
>
> {$codepage utf8}
> Var LCad:^ansiString;
> Begin
> getmem(LCad,5*3); //ansistring is a pointer 4 bytes
> LCad[0]:='01234';
> LCad[1]:='56789';
> LCad[2]:='11111';
> Writeln(LCad[2]);
> freemem(LCad)
> End.
I'm surprised this compiles at all.
You're mixing up manual allocation of memory on the heap for variables
such as arrays with compiler allocation of heap memory for ansistrings
(which are reference counted and deallocated automatically).
You're safer using an array of shortstrings whose size is known at
compile time:
type s5 = string[5];
LCad = array[0..2] of s5;
PLCad = ^LCad;
Var pArr: PLCad;
begin
getmem(pArr, sizeof(LCad));
pArr^[0]:='01234';
pArr^[1]:='56789';
pArr^[2]:='11111';
Writeln(pArr^[2],' ',pArr^[1],' ',pArr^[0]);
writeln('Sizeof(LCad) has value ', sizeof(LCad));
freemem(pArr);
end.
yours
Howard
More information about the fpc-pascal
mailing list