[fpc-pascal] PWideChar vs. ^
Marc Weustink
marc at dommelstein.net
Sat Mar 14 00:17:40 CET 2009
Marc Santhoff wrote:
> Hi,
>
> maybe this is a dumb question, but:
>
> If I have a variable declared as
>
> var
> s: PWideString;
>
> why is an exception (AV) thrown when using
>
> something := s^;
>
> but not when using
>
> something := PWideChar(s);
>
> ?
You're mixing things up.
A Widestring is a dynamically allocated type which holds wide chars.
So when declaring
var
W: Widestring;
you are under the hood in fact declaring a pointer to a dynamically
allocated (referencecounted on non windows) struct holding the string.
What you declare is a pointer to this
var
S: PWideString;
Like a variable of a PChar type this pointer doesn't contain anything
but random noise, unless you initialized it.
When you assign
something := s^;
you are dereferencing random data, which in most cases cause an AV.
(even worse in this case since you assume this random data is a pointer
to a widestring)
When you cast and assign
something := PWideChar(s);
you treat this random pointer as a pointer to widechars. If you are
lucky you are allowed to read this data and it is somewhere #0#0
termintated, so that is can be intrepreted and converted to a something.
> Maybe this is special behaviour of the routine getting the variable, it
> is
>
> TTreeView.AddChild(ParentNode: TTreeNode; const s: string): TTreeNode
I guess this is not the same S
Marc
More information about the fpc-pascal
mailing list