aaz@pucc-i (Marc Mengel) (08/06/85)
Followup-To: net.lang.c Path: ...!pur-ee!pucc-i!aaz Keywords: Summary: passing a 0 for a pointer argument is broken > f(ptr) > foo *ptr; > { > [code] > } > > calling f(0) is dangerous. But my friend contends that calling > f() with a zero char pointer, e.g. f((char *)0), is safe, because > (char *) is the largest pointer, and that he doesn't know of a C > implementation that doesn't pass all pointers as the largest > possible pointer (ala the way floats always get passed as doubles). The only *correct* thing to pass to f() is a "(foo *) 0". The problem here is that if you call f with a zero (which is an int) and the function is expecting a pointer (which *could* need to be as big as a long int), which gives either an upper or lower half of a long int which is GARBAGE on some C compilers (like most for the 68000 which use 16 bit ints, and 32 bit long ints and pointers ). The (char *) should work on most machines, but once again, it is possible that there may be different sized or alligned pointers for various objects. (Does anybody remember the discussion some months ago about encodeing the size of what a pointer points to in the upper n bits and shifting it over before using it?...) So I emphasise, the only Right Thing to do here is to pass a (foo *) 0. Besides, lint even likes it :-) -- Marc Mengel {ihnp4|decvax|icalqa|uiucdcs|cbosgd|harpo}!pur-ee!pucc-i!aaz ...!purdue!pucc-i!aaz (Message inbox:30) Return-Path: <agt@pucc-k> Received: from pucc-k (pucc-k.ARPA) by pucc-i; Tue, 30 Jul 85 17:09:51 est Received: by pucc-k; Tue, 30 Jul 85 17:07:57 est Date: Tue, 30 Jul 85 17:07:57 est From: Kevin Braunsdorf <agt@pucc-k> Message-Id: <8507302207.AA06122@pucc-k> Uucp: { decvax, icalqa, ihnp4, inuxc, sequent, uiucdcs }!pur-ee!pur-phy!csc { decwrl, hplabs, icase, psuvax1, siemens, ucbvax }!purdue!pur-phy!csc Apparently-To: aaz