Sponsored link Serve your customers, not your servers, with VERIO Linux VPS. Full-access test-drive here. |
null pointersnull pointersPosted Mar 19, 2008 20:44 UTC (Wed) by tialaramex (subscriber, #21167)In reply to: null pointers by vmole Parent article: Who maintains dpkg?
How is what I said "still not it" when it's exactly the same as your explanation ?
(Log in to post comments)
null pointers Posted Mar 19, 2008 21:11 UTC (Wed) by vmole (subscriber, #111) [Link] Because it's not a matter of narrow vs. wide, or using something "narrower than (void *)". If the function specification says "This vararg list is terminated by null character pointer", then, by the standard, you have to pass something equivalent to "(char *) 0", and "(void *) 0" isn't. The idea of a "void *" being generic is that variables of type "void *" can store pointers of any type, and pointers can be cast to void and then back to the original type without information loss. But they are a distinct type, and not necessarily interchangeable with other pointer types. Does this matter the vast majority of the time? No. Is it C standard lawyer nitpickery of the most annoying kind? Yes, of course. But the C89 standard is this way precisely because there were some systems for which this kind of nitpicking *did* matter. But yes, where you wrote: "It seems to me that (type *) NULL is still a perfectly good choice of value for such a parameter." is correct. I should have distinguished that in my original reply.
A small nit-pick... Posted Mar 19, 2008 22:27 UTC (Wed) by dw (subscriber, #12017) [Link] "The idea of a "void *" being generic is that variables of type "void *" can store pointers of any type, and pointers can be cast to void and then back to the original type without information loss." As far as I remember it is illegal to convert between void* and any function pointer type in ANSI C; POSIX' specification of dlsym() actually relies on what is essentially a vendor extension to work for function pointers.
A small nit-pick... Posted Mar 19, 2008 22:52 UTC (Wed) by vmole (subscriber, #111) [Link] Oops, you're correct about that. I just looked in Plauger and Brodie's "Standard C" (which is not the standard, but I think we can trust them), and they agree: it's *object* pointers that can be intraconverted with void pointers. But the hilarious thing is this: The types _pointer_to_char_, _pointer_to_signed_char_, _pointer_to_unsigned_char_, and _pointer_to_void_ all share the same representation.So "(void *) 0" is interchangeable with "(char *) 0", but not "0" or "(int *) 0".
A small nit-pick... Posted Mar 19, 2008 23:15 UTC (Wed) by nix (subscriber, #2304) [Link] This is surely related to the aliasing rules, which also have a similar special hole allowing aliasing of of void * and char *, but not of pointers of any other distinct types.
|
Copyright © 2008, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds
Powered by Rackspace Managed Hosting.