Newsgroups: comp.lang.c Path: utzoo!sq!msb From: msb@sq.sq.com (Mark Brader) Subject: Creating pointer with all bits 0 (was: Referencing NULL pointers) Message-ID: <1989Aug31.052756.18524@sq.sq.com> Summary: Use union {char c[sizeof(foo*)]; foo *p;} ... Reply-To: msb@sq.com (Mark Brader) Organization: SoftQuad Inc., Toronto Date: Thu, 31 Aug 89 05:27:56 GMT > > could you not access memory location 0 by writing: > > p = 0; /* integer variable that happens to be set to zero */ > > data = *(int *)p; /* no constant expression in this line */ > Probably, but there's nothing to stop a cast doing something strange. > This may work better (but of course is still completely unreliable): > union {int i; int *p} x; > x.i = 0; > data = *x.p; Int indeed. However, this is suggestive. You could do: union {char c [sizeof (int *)]; int *p;} x; int i; for (i = 0; i < sizeof x.c; ++i) x.c[i] = 0; data = *x.p; On the other hand, it's simpler to use memset(): int *p; memset ((void *) p, 0, sizeof p); data = *p; Or bzero() if you have that and not memset(), or for that matter there's the trickier but more universally available way: strncpy ((char *) p, "", sizeof p); It may as well be repeated for anyone who's coming in late that the point here is to get a pointer p with all bits zero, for use on a machine where null pointers have some other pattern of bits and all-bits-zero is a meaningful pointer. It may as well also be repeated that the bit pattern (or patterns; they could depend on the type) of null pointers have nothing to do with the fact that 0 is a correct way to write a null pointer constant. -- Mark Brader, SoftQuad Inc., Toronto, utzoo!sq!msb, msb@sq.com #define MSB(type) (~(((unsigned type)-1)>>1)) This article is in the public domain.