It makes me a bit confused

Q&A's, tips, howto's
Locked
psilwen
Posts: 21
Joined: Thu Jul 03, 2014 5:25 am

It makes me a bit confused

Post by psilwen »

Code: Select all

> (struct 'A "char*")
A
> (pack A "HELLO")
"\176\154d\000"
> (unpack A (pack A "HELLO"))
("HELLO")
> (setq a (pack A "HELLO"))
"0\154d\000"
> (unpack A a)
("\006") ; <------------
> (setq b "HELLO")
"HELLO"
> (setq a (pack A b))
"p\154d\000"
> (unpack A a)
("HELLO")
(reverse "newlisp")

ralph.ronnquist
Posts: 228
Joined: Mon Jun 02, 2014 1:40 am
Location: Melbourne, Australia

Re: It makes me a bit confused

Post by ralph.ronnquist »

I'm not sure which part is confusing for you. I think the story would be something like the following:

A char* is a pointer to a char, and not the array of char that it points to.

Thus, with

Code: Select all

(pack A "HELLO")
a char* record created with a pointer that points to the temporarily allocated char array "HELLO", which then incidentally survives to the next prompt, but not as much as being able to be unpacked. The pointer points into the heap, to an address that is reused with the next input.

When b is set however, the char array is also preserved, as the value of b, and therefore the second packing yields a pointer record with a pointer to that preserved character array.

Locked