On Sun, Feb 11, 2018 at 7:30 PM, Werner LEMBERG <w...@gnu.org> wrote:
>
>>>  (void*)(size_t)(x) should be safe, c90, and warning-less.
>>
>> You assume that all machines have a flat, linear memory model.... ;-(
>>
>> The "safe", portable way is to use
>>
>>   (void *)(((char *)0) + (x))
>>
>> to cast an integer to a void pointer, and use
>>
>>   (ptrdiff_t)((char *)(x)) - ((char *)0)
>>
>> to cast a pointer to an integer.
>
> Interesting.  Can you name an example of a machine with a non-linear
> memory model?

24bit/32bit embedded CPU designs, typically designs predating the
widespread adoption of 64bit address space&&pointers. For example i960
can implement one-address-space-per-object-type - for those who
remember C64's "banking": Sort of One-bank-per-object-type. In such a
scenario a pointer is only valid for the type it was used for since
the same "integer" value can refer to a completely different chunk of
memory for another object type.

A more classical scenario is data&&code separation as in the
https://en.wikipedia.org/wiki/Harvard_architecture

That's why the wording in the ISO >= C89 standard has a bit more
complex wording about pointer differences, but I can't quote them
since my book 
(https://www.amazon.de/Annotated-ANSI-Standard-Programming-Languages-C/dp/0078819520/ref=sr_1_1)
is a few 100km away right now...

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) roland.ma...@nrubsig.org
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)

_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to