j.j.fishbat@[EMAIL PROTECTED]
wrote:
>
> Hi all
>
> > Consider the fact that a "void *" and a "char *" need not be stored
> > the same way.
>
> OK, I am the idiot then. I had thought, for the past 10 years
> C programming, that a pointer to char was the same as a
> pointer to int was the same as a pointer to foobar_t, the only
> difference being what it pointed to. And that this fact enables
> one to cast to void* to enable generic programming.
>
> I see I'll have to rewrite some code.
>
> Thank you again to all who replied!
Well, you have probably been programming on a platform on which all
of the data pointer types are represented the same way. (And, I
must confess, so have I.) However, C does not guarantee such a
thing, and I believe others have posted here examples of systems
in which they are, in fact, represented differently.
Yes, you can convert from any pointer to "void *" and back again.
But, you can't, for example, convert from "int *" to "void *" and
then to "long *", and dereference that pointer without invoking
UB. (In fact, the converting to "long *" step itself may be UB.)
Note, too, that Mr. van D?k (sorry about the mangling of the name,
but my newsreader is obviously not UTF-8 compliant) says that the
standard does say that "void *" and "char *" are special cases
which must be represented the same way. If that is true, then
your original example will "work" as-is, but only because you
are converting "char **" to "void **". It's not guaranteed to
work with, for example, "int **" to "void **", in a "****table"
manner. Again, it will probably "work" on your systems, because
they are likely to be storing "void *" and "int *" in the same
representation.
--
+-------------------------+--------------------+-----------------------+
| Kenneth J. Brody | www.hvcomputer.com | #include |
| kenbrody/at\spamcop.net | www.fptech.com | <std_disclaimer.h> |
+-------------------------+--------------------+-----------------------+
Don't e-mail me at: <mailto:ThisIsASpamTrap@[EMAIL PROTECTED]
>


|