On 2023-06-30 11:11, Michael Van Canneyt via fpc-pascal wrote:
On Fri, 30 Jun 2023, Hairy Pixels via fpc-pascal wrote:



On Jun 30, 2023, at 9:03 AM, Hairy Pixels <generic...@gmail.com> 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;
  p:=@s[1]; // 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
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to