Michael Van Canneyt wrote 29 lines
On Fri, 30 Jun 2023, Hairy Pixels via fpc-pascal wrote:
>
>
>> On Jun 30, 2023, at 9:03 AM, Hairy Pixels
>> wrote:
>>
>> That's why that worked. Hmm with short strings the null terminator
>> could be truncated when copying right? Something to look out for.
>
> this is what I meant about truncation. S is no longer null terminated
> and now the pchar will fail when passed to C libraries right?
>
> var
> s: String;
> p: Pchar;
> begin
> s := 'hello';
> p := @s;
S will still be null-terminated for ansistrings and shortstrings.
change to
s:=s+s;
; // and not @s
writeln(p[Length(s)+1]=#0);
and it will print TRUE.
However, there are operations valid for Pascal shortstrings which would break this - as an example, older Pascal code used to change the S[0] (i.e. the length byte) for a shortstring which wouldn't ensure that #0 follows such a moved end of the Pascal shortstring.
Moreover, note that #0 is a valid character in Pascal strings, i.e. in general it is _not_ guaranteed that the trailing #0 after the end of the string is the first one encountered when passing the string to a C code. Obviously, you can ensure this in your own code, but it's important to stress that neither the compiler nor the FPC RTL check or enforce full equivalence of Pascal strings and C null-terminated strings.
Tomas