HDTenEightyP/NetNews huggingface dataset:
From: atbowler@thinkage.on.ca (Alan Bowler)
Subject: Re: char *fgetline(FILE*);
Organization: /etc/organization
Date: Tue, 14 Apr 1992 22:15:21 GMT

In article <22531@dog.ee.lbl.gov> torek@horse.ee.lbl.gov (Chris Torek) writes:
>
>The original BSD fgets did not stop at NULs, so that a stream containing
>the input line
>
>	abc\0\0\n
>
>would fill in a suitable buffer with "abc\0\0\n\0".  I cannot speak for
>current SunOS internals, although if they are derived from a V7ish
>stdio they are likely to behave the same way.

I ran across this problem a while ago when someone get such a file
to our C compiler.  Since CPP was using fgets, this resulted in some
cryptic error messages.   We had not previously seen it because the
system where we doe most of our word does not allow NUL`s in text
files.
    Anyway, I pulled out the ANSI standard, and came to the conclusion
that this behaviour is mandated by ANSI.  fgets() can only stop on
'\n', EOF or an error, so if you use fgets() on a file containing
NUL's, you will lose any characters between the '\0' and the next '\n'.
Stopping on NUL would be very useful, since you could detect it by
checking to see if the last char was a `\n`, but it seems to be
forbidden by the standard.
Newsgroups: comp.lang.c
From: dwmorby@descartes.waterloo.edu (Darren W. Morby)
Subject: Re: Suspicious pointer conversion?
Organization: University of Waterloo
Date: Wed, 15 Apr 1992 20:58:53 GMT

In article <11404@anderson> anderson@Software.Mitel.COM (David Anderson)
writes:
>In article <57006@cup.portal.com> ts@cup.portal.com (Tim W Smith) writes:
>>>To declare signal(), using prototypes, but without typedef, we must write:
>>>   void (*signal(int, void (*)(int)))(int);
>>>This is not particularly readable. [...]

>I have been using a very easy rule to reading complicated declarations that I
>use when teaching C for the College, called the "Clockwise Rule". I read
>[Describes the clockwise rule...]
>One last point, for things like const and volatile and far etc..., always
>associate them from left to right; for example:
>        const char *chptr;
>o Associate const with the token to the right, so in your mind imagine as if
>  it was declared as follows:
>        (const char) *chptr;
>o Now, what is chptr??
>  "chptr is a pointer to a constant char"

Correct.

>How about this one:
>        char const *chptr;
>o Associate the const with the token to the right and you then imagine:
>       char (const *)chptr;
>o Now, what is chptr??
>  "chptr is a constant pointer to char"

Incorrect.  This is also "'chptr is a pointer to a constant char.'"
(In your imagination, it appears  (char const) *chptr; )

If the pointer is to be qualified with const or volatile, the qualifier
appears _after_ the *, like so:

        char * const chptr;

Now, "chptr is a constant pointer to char."  You may think of it as this
(which happens to be legal in this case):

        char (* const chptr);
-- 
[ Darren W. Morby                 ]
[ University of Waterloo, Ontario ]
[ dwmorby@descartes.waterloo.edu  ]
Newsgroups: comp.lang.c
From: peter@ferranti.com (Peter da Silva)
Subject: Re: PLEASE don't use "long long" for 64 bits + answer to letter
Organization: Xenix Support, FICC
Date: Fri, 17 Apr 1992 15:49:45 GMT

In article <294@lafcol.lafayette.edu> doughera@lafcol.lafayette.edu (Andy Dougherty) writes:
> I'll be that C vendors will.  I used to work on a 68000-based machine
> for which 16-bit operations were much faster than 32-bit operations.

I still do. And my compiler provides both 16-bit and 32-bit integer modes.
And I have two libraries for it, for the benefit of pre-ANSI code. And it
works just fine, thank you very much.

The default used to be 16 bit. With 68020 and better systems out now, the
default is 32 bit.

Of course this is a machine with a fairly large market share, compared with
UNIX.
-- 
/F{findfont exch scalefont setfont}def /S{moveto show}def /T{/Times-Roman F}def
8 T(Ferranti International Controls Corporation)24 28 S(+1 713 274 5180)24 12 S
(Sugar Land, TX  77487-5012)24 20 S 12 /Courier F(`-_-')320 32 S( 'U` )320 16 S
12 T(Peter da Silva)24 36 S 16 T(Have you hugged your wolf today?)358 24 S
Newsgroups: comp.lang.c
From: eknowles@cbnewsm.cb.att.com (edmund.knowles)
Subject: popen
Organization: AT&T
Date: Mon, 13 Apr 1992 14:08:57 GMT
Keywords: popen


Hello netters,
	I am using popen as follows:
.
.

if((cmd_ptr = popen(ptr, "r")) == (FILE*)NULL)
{
	fprintf(stderr,"......ERROR STUFF...")
	return(-1);

}
.
.
.

My question is this . If popen fails my ERROR STUFF get printed
and I return with that error code ok.

what happens if popen succeeds but my shell command fails?
lets say the : "sh: ls not found"

How can I get the exit code into my program?

Thanks in advance.
Xref: sparky comp.lang.c:7551 comp.std.c:1808
From: murphy@mips.com (Mike Murphy)
Newsgroups: comp.lang.c,comp.std.c
Subject: Re: PLEASE don't use "long long" for 64 bits + answer to letter
Followup-To: comp.lang.c
Date: 13 Apr 1992 21:36:58 GMT
Organization: MIPS Computer Systems, Sunnyvale, California
NNTP-Posting-Host: ada.mips.com

In article <1992Apr12.115955.6944@sdf.lonestar.org> bolan@sdf.lonestar.org (Bolan Meek) writes:
>I really didn't know of any issue on this before reading these posts of late,
>but, despite some small possibility of confusion, I'd like to promote the
>next larger integral type (after char,small,int, & long) to be "double long",
>the risk being confusion on the part of a programmer with "long double", 
>another non-standard type.  But if enough would want it, it'd get put into the
>standard, no?

ANSI C states that the type specifiers may occur in any order, 
so "double long" is actually the same as "long double".  See 3.5.2.
--mike
Newsgroups: comp.lang.c
From: darcy@druid.uucp (D'Arcy J.M. Cain)
Subject: Re: atexit exit call order
Organization: D'Arcy Cain Consulting
Date: Fri, 10 Apr 1992 14:22:20 GMT

wirzeniu@klaava.Helsinki.FI (Lars Wirzenius) writes:
>etxolpn@beppe22.ericsson.se (Ola Persson) writes:
>>I'm using Sun ansic compiler and the function atexit. Does anybody know in
>>which order the exit handlers are called when i establish more than one. Is
>>this behaviour compatible?
>Accordning to the ANSI standard, the functions are called in reverse
>order.  You should be able to find some information about the order in
>which Sun's library call them by reading the manual page (``man
>atexit'', perhaps), or other documentation.

Or if you have ever seen incorrect <gasp> documentation you can test the
compiler directly:

#include	<stdio.h>
#include	<stdlib.h>
#define	e(x) static void e##x(void) { printf("Exit %d\n", x); }
e(1) e(2) e(3)
int main(void)
{
	atexit(e1); atexit(e2); atexit(e3);
	return(0);
}

On an ANSI compiler this should display:

Exit 3
Exit 2
Exit 1

-- 
D'Arcy J.M. Cain (darcy@druid)     |
D'Arcy Cain Consulting             |   There's no government
Toronto, Ontario, Canada           |   like no government!
+1 416 424 2871          DoD#0082  |
Newsgroups: comp.lang.c,comp.sys.mac.programmer
From: Steve Creps <creps@silver.ucs.indiana.edu>
Subject: Re: Problem De-allocating Memory in variable sized arrays
Organization: Indiana University
Date: Mon, 6 Apr 1992 10:37:35 -0500

In article <1992Apr1.222646.10433@coe.montana.edu> umsfjban@bill.oscs.montana.edu (Jeff Banfield) writes:
>I have a problem in de-allocating memory that I have allocated using
>NewPtr.  I'm working on some image analysis software so I need to

>unsigned char  	**DATA;
>int		NROW, NCOL;
>
>void allocateDATA (void)
>{
>	register i;
>
>	DATA = (unsigned char **) NewPtr(NROW * sizeof(unsigned char *));
>	DATA -= 1;	/* to allow indexing starting at 1 */
>
>	for (i = 1; i <= NROW; i++){
>	    DATA[i] = (unsigned char *) NewPtr(NCOL * sizeof(unsigned char));
>	    DATA[i] -= 1;  /* to allow indexing starting at 1 */
>	}
>}
>
>void freeDATA (void)
>{
>	register i;
>
>	for (i = 1; i <= NROW; i++){
>	    DisposPtr(DATA[i] + 1);  /* + 1 because of index starting at 1 */
>	}
>	DisposPtr(DATA + 1);   /* + 1 because of index starting at 1 */
>}

   First I would ask (not a flame) why you want to start the array indices at
1 instead of zero?  You said you are new to C, so you may not yet have found
that arrays nearly always start at 0 in C programs.  IMO it's better to start
doing (and getting used to) zero-based arrays sooner than later.

   I strongly suspect that your problem has something to do with the way you
are manipulating DATA (e.g. adding and subtracting).  I suggest changing the
program to start the array at zero (remember to change "i <= NROW" to "i <
NROW").  I'm not absolutely sure that that will fix it, but one experiment is
worth a thousand theories.

   Anyway, you probably don't want to be incrementing and decrementing
pointers.  This practice often works, but it is not guaranteed that it
always will.  Your mileage may vary, depending on operating system, compiler,
and the data types involved.

-	-	-	-	-	-	-	-	-	-
Steve Creps, Indiana University
creps@silver.ucs.indiana.edu (129.79.1.6)
{inuxc,rutgers,uunet!uiucdcs,pur-ee}!iuvax!silver!creps
From: jos@and.nl (Jos Horsmeier)
Newsgroups: comp.lang.c
Subject: Re: Is the address of a global a constant?
Date: 7 Apr 92 15:03:58 GMT
Organization: AND Software BV Rotterdam

In article <1992Apr6.201518.969@pencom.com> eric@pencom.com writes:
|
|Is the address of a global supposed to be considered a valid constant?
|i.e. gcc will not allow the following on 2 counts :
|
|extern int a,b,c ;
|
|int foo(int *p)
|{
|        switch(p)
|	{
|		case &a :
|		    return 1 ;
|[ ... ]
|
|gcc first complains that p is not an integer.
|It then complains that the switch labels are not constant.
|Are these valid compiler gripes?

Being a constant expression is not enough to act as an expression for
a switch statement. 

(quotes)

ANSI-C: 3.6.4.2 The switch statement

Constraints

The controlling expression of a switch statement shall have integral type.

[ ... ]

Semantics

[ ... ]

The constant expression in each case label is converted to the promoted
type of the controlling expression.

ANSI-C: 3.3.3.2 Address and indirection operators

Semantics

The result of the unary & (address-of) operator is a pointer to the object
or function designated by its operand. If the operand has type 'type,' the
result has the type `pointer to type.'

(end quotes)

A pointer to an integral type is not an integral type itself. I'm not so 
sure about &a (where a is a global variable) whether or not this is a 
constant expression. I think it is, but I'm not sure:

(quote)

3.4 Constant expressions

Description

A constant expression can be evaluated during translation rather than
runtime, and accordingly may be used in any place that a constant may.

(end quote)

Apparently gcc doesn't treat &a as a constant expression. But nevertheless,
the &a expression is not of integral type, so it cannot be used as a
case label.

Jos aka jos@and.nl
Newsgroups: comp.lang.c
From: andrews@sp1.csrd.uiuc.edu (John Andrews)
Subject: Re: Info Re: Header files and the like
Organization: UIUC Center for Supercomputing Research and Development
Date: Fri, 17 Apr 92 04:14:35 GMT

dd3e+@andrew.cmu.edu (Danny R Dalal) writes:

>2.>  Is there a document that defines how to modularize a big program? 
>I'm tired winging it (trial and error: maybe I should put the data
>structure here and the externs here and include the .h here... etc...). 
>I want to know exactly how it all works.  I looked in K&R but that was
>strangely lacking.  Any insight and especially references would be
>greatly appreciated.

I don't think there is an ideal way to do it, which is one thing that really
bugs me about C.  I just defined a new way of doing it for a program I am
working on.  I came up with this approach after reading K&R, Bjarne Stroustrup's
book on C++, and David Straker's book called "C Style: Standards & Guidelines".
The last two cover this topic better than K&R.  There are several ways of
doing things.  I can email you my method if you like.

--
John Andrews (andrews@csrd.uiuc.edu) "He who dies with the shortest .sig, wins"
Graduate Research Assistant, Center for Supercomputing R&D, Urbana, IL
Xref: sparky comp.lang.c:7276 gnu.gcc.help:1030
From: c162-dn@danube.Berkeley.EDU (David Loo)
Newsgroups: comp.lang.c,gnu.gcc.help
Subject: as0 Error
Date: 6 Apr 92 23:36:38 GMT
Article-I.D.: pasteur.1992Apr6.233638.1070
Organization: University of California, at Berkeley

I'm writing some C code with inline assembler instructions
and I'm getting an as0 error when I compile with gcc stating:

as0: Error: comp.c, line 254: Symbol must have absolute value: $2
      lw $4, $2
as0: Error: comp.c, line 254: Symbol must have absolute value: $2
      lw $4, $2
as0: Error: comp.c, line 254: Symbol must have absolute value: $2
      lw $4, $2
as0: Error: comp.c, line 254: Symbol must have absolute value: $2
      lw $4, $2


It turns out that line 254 is the open parenthesis to a function.

253:	void Output(FILE *file, char **bittable, int *table)
254:	{
255:	        unsigned char constbits, TheByte;


Does anyone have a clue what is causing the problem?

Please reply by e-mail.  I'd really appreciate any help whatsoever
so long as it arrives before 5:00 pm today (Project Deadline).


	Thanks Much,

	Dave
	c162-dn@danube.berkeley.edu
Newsgroups: comp.lang.c
From: mccall@mksol.dseg.ti.com (fred j mccall 575-3539)
Subject: Re: Why aren't my floats passing as doubles?
Organization: Texas Instruments, Inc
Date: Wed, 15 Apr 1992 16:01:25 GMT

In article <1992Apr14.175124.27785@mccc.edu> pjh@mccc.edu (Pete Holsberg) writes:
>In article <1992Apr12.173842.12995@athena.mit.edu> scs@adam.mit.edu writes:
>=... the ANSI C Standard explicitly allows implementations
>=to pass floats as floats (as long as "new style" function
>=declarations and definitions are in use), obsoleting the pre-ANSI
>=rule that all floats were promoted to double.
>
>Is it true that *both* prototype declarations *and* ANSI C style
>definitions are required? For some reason, I had thought that just the
>prototype declaration was sufficient.

From previous discussion, I understand that this is the case.  If you
use a prototyped declaration and 'K&R' style definition, you can
conceivably get problems with the caller passing floats and the calle
expecting the 'widened' double (because he got the traditional
declaration). 

Frankly, I wish that ANSI had defined this to behave differently when
there is a prototype in scope, since I prefer the 'old style'
definitions for parameters as being more 'consistent' with how
variables are normally declared in C.  But they didn't.

>
>Pete
>-- 
>Prof. Peter J. Holsberg      Mercer County Community College
>Voice: 609-586-4800          Engineering Technology, Computers and Math
>FAX: 609-586-6944            1200 Old Trenton Road, Trenton, NJ 08690
>Internet: pjh@mccc.edu       Trenton Computer Festival: April 17-18, 1993


-- 
"Insisting on perfect safety is for people who don't have the balls to live
 in the real world."   -- Mary Shafer, NASA Ames Dryden
------------------------------------------------------------------------------
Fred.McCall@dseg.ti.com - I don't speak for others and they don't speak for me.
From: dong@umiacs.umd.edu (Dong Chen)
Newsgroups: comp.lang.c
Subject: passing structure to a function
Date: 7 Apr 92 16:34:51 GMT
Organization: UMIACS, University of Maryland, College Park, MD 20742

Hello,

I have a lot of fuctions doing processing for some type of
structures. Now as concern of efficiency, is it better to
pass the structures as a pointer or just pass the structure
itself ?

something like f(struct S a) vs. f(struct S *a).

Xref: sparky comp.lang.c:7312 comp.os.msdos.programmer:5230 comp.lang.c++:6558
From: winter@cirrus.com (Keith Winter)
Newsgroups: comp.lang.c,comp.os.msdos.programmer,comp.lang.c++
Subject: Re: Borland Turbo C++ and memory problem at startup
Date: 7 Apr 92 16:03:17 GMT
Organization: Cirrus Logic, Inc.

In article <1992Apr4.183038.15938@ux1.cso.uiuc.edu>, chojnows@osiris (Brian Chojnowski) writes:
> 
> joec@fid.morgan.com (Joe Collins) writes:
> 
> >I have installed BORLAND TURBO C++ (V3.0) on my Gateway 386-25Mhz
> >machine. In then invoke 'tc' and receive 'Memory manager cannot initialize'.
> >I use EMM386 (for windows 3.0), but with no parms.
> 
> >1-I suspect Borland wants some expanded memory and it looks all tied up.
> >2-Does anyone know of a parm to keep some pages free in Config.sys at
> >  boot time? I think Borland wants at least 5 pages available.
> 
> DEVICE=EMM386.SYS /ram
> or     EMM386.SYS ????k /ram
> 
> the ???? is the amount of extended memory to emulate expanded.
> 
I've tried this exact thing and it allowed TC to run for a while but then aborted
with all sorts of traps and exceptions.  Also, one I used the 'ram' parameter, I
could no longer load any device drivers high.  The other problem with the ram
directive is Windows wants the noems directive (I think).

I would be appreciative of any helpful suggestions on this problem.  I may have
to resort to calling Borland but according to the documentation I can't get help
until I register the software and I don' see any point in doing that until I get it to
load and run.  If I can't make that happen, I will return it and go back to 2.0.

Keith Winter, Cirrus Logic, Inc.  (winter@cirrus.com)
From: nadeau@JSP.UMontreal.CA (Nadeau Jean-Claude)
Newsgroups: comp.lang.c
Subject: Re: Best Compiler for teaching?
Date: 11 Apr 92 16:58:56 GMT
Organization: Universite de Montreal

In article   writes:
>u!monu6!dx486.bs.monash.edu.au!chaolin
>From: chaolin@fcit-m1.fcit.monash.edu.au (CHAOLIN CHANG)
>Newsgroups: comp.lang.c
>Subject: Best Compiler for teaching?
>Message-ID: <chaolin.52@fcit-m1.fcit.monash.edu.au>
>Date: 9 Apr 92 22:38:40 GMT
>Sender: news@monu6.cc.monash.edu.au (Usenet system)
>Organization: Faculty of Computing and Information Technology, Monash University
>Lines: 12
>
>Dear Netter,
>
>What compiler would you use for teaching ANSI C under DOS environment?

	I think that Turbo C++ (from Borland) is the best one (with some
	switches ON!).  It is really ANSI conformant and can be used also
	to teach C++.  I've use it for a couple of year now with
	success.


-- 
Jean-Claude Nadeau, ing.	<nadeau@JSP.UMontreal.CA>
Services informatiques		<nadeau@ERE.UMontreal.CA>
Universite de Montreal		<nadeau@UMTLVR.BITNET>
Tel. (514) 343-6111,ext 5234	Fax  (514) 343-2155
Newsgroups: comp.lang.c
From: m-sj7228@DOPEY.CS.NYU.EDU (Sanjay Jaiswal)
Newsgroups: comp.lang.c
Subject: Address of FAQ site for comp.lang.c
Date: 7 Apr 92 17:01:26 GMT


D
Can anyone inform the FAQ site address for comp.lang.c ?
thanks

sanjay
From: exuhag@exu.ericsson.se (James Hague)
Newsgroups: comp.lang.c
Subject: Re: Register declaration
Keywords: ambiguity,register,declarations
Date: 9 Apr 92 13:50:13 GMT
Organization: Ericsson Network Systems, Richardson, TX

Steve Clamage writes:
>
>Some compilers elect to make the optimistic assumption that no
>aliasing takes place, and generate small and fast code.  I suppose
>the vendors believe that it is better to generate wrong answers
>quickly than correct answers slowly.  Such compilers are not
>conforming, but generally have some option to tell them to make
>pessimistic assumptions about aliasing.
>
>In my view, such compilers are dangerous.  I don't believe the
>programmer should have to request specifically via a language
>extension or compiler flag that correct code be generated.

This has always bothered me as well.  I don't think it should
be possible for a compiler to generate incorrect code.  Along
the same lines are compilers that let you individually toggle
a dozen or so different optimizations--optimizations which
are so intertwined that selecting them individually doesn't
make any sense.  Of course this is usually because an optimizer
is viewed as a tool which will increase code speed while
*possibly* keeping it equivalent to the original program.
I have seen too many cases where selectively tweaking the
optimization settings makes bugs magically disappear.
--
James Hague   
exuhag@exu.ericsson.se
From: barmar@think.com (Barry Margolin)
Newsgroups: comp.lang.c
Subject: Re: passing structure to a function
Date: 8 Apr 1992 16:11:36 GMT
Organization: Thinking Machines Corporation, Cambridge MA, USA
NNTP-Posting-Host: telecaster.think.com

In article <1992Apr7.204230.23146@pencom.com> eric@pencom.com writes:
>Generally, it is better to pass pointers to structures, except
>(maybe) if the structure is small (<= 1 word).

If better == more efficient, this is true.  In other cases, it depends on
what you want to do with the structure.  If the callee modifies the
structure it receives, then the results will be quite different; if a
pointer is passed, the caller will see the changes, but if the structure
itself is passed the caller will (probably [see below]) not see the
changes.

>Some architectures will create a copy of the structure and pass
>a pointer to the copy if you tried to pass a whole structure
>in the first place.

I believe ANSI C requires that structures be passed by value, and I also
think that most pre-ANSI C compiler that support structure passing also do
so.  But there may be exceptions, or compiler switches that can change it.

That reminds me: structure arguments and values were not in the original C
definition, so there are probably some compilers around that don't support
it.  But they should all support passing pointers to structures (any that
doesn't shouldn't be called C).
-- 
Barry Margolin
System Manager, Thinking Machines Corp.

barmar@think.com          {uunet,harvard}!think!barmar
Newsgroups: comp.lang.c
From: darcy@druid.uucp (D'Arcy J.M. Cain)
Subject: Re: Please Help on: float # to string conversion
Keywords: string float conversion
Organization: D'Arcy Cain Consulting
Distribution: comp.lang.c
Date: Fri, 17 Apr 1992 12:58:22 GMT

<chiu>@me.utoronto.ca writes:
>Could somebody kindly send me some C SOURCE code for converting
>float # to a array of char?

sprintf()

Since he is local to me I am sending him the FAQ so no need to do so
from elsewhere.

-- 
D'Arcy J.M. Cain (darcy@druid)     |
D'Arcy Cain Consulting             |   There's no government
Toronto, Ontario, Canada           |   like no government!
+1 416 424 2871          DoD#0082  |
From: jfw@ksr.com (John F. Woods)
Newsgroups: comp.lang.c
Subject: Re: EXPONENT
Date: 14 Apr 92 11:44:09 EDT

>I am new to the C language. Can anybody tell me how to write the following
>FORTRAN code in C:
>       a=b**(1./d)

	#include <math.h>
	...
		double a, b, d;
		...
		a = pow(b, 1. / d);

Read a copy of the ANSI Standard or a C library manual to learn how pow()
behaves in error cases.
Organization: Ryerson Polytechnical Institute
Distribution: na
Date: Friday, 10 Apr 1992 00:09:01 EST
From: <ACPS7081@RyeVm.Ryerson.Ca>
Newsgroups: comp.lang.c
Subject: a reading from keyboard


Hi
I would like to know how can I read from keyboard without using return
key.


                                                 Thanks for your attention!
Newsgroups: comp.lang.c
From: C580503@umcvmb.missouri.edu (Albert Foo)
Subject: C SRC FOR DBASE ACCESS?
Organization: University of Missouri, Columbia
Date: 7 Apr 1992 23:30:48 CDT

Has anybody written some routines in 'c' accessing dbase .dbf files?
Or is there a public domain source available at a ftp site?

I'll appreciate anyone who can help. Thanks|
Please send your replies to: c580503@umcvmb.missouri.edu
From: jfw@ksr.com (John F. Woods)
Newsgroups: comp.lang.c
Subject: Re: ANSI C NULL with cast as a function arg generates lint warning
Date: 6 Apr 92 15:05:55 EDT

jfw@ksr.com (John F. Woods) writes:
>>		Ex.:  void *vnullp = NULL;
>>		      execl("/bin/ksh", "ksh", "kill -l", *(char **)&vnullp);
>Don't do this.  I think it is guaranteed to work

No, I don't (gotta go back to regular coffee :-).  (char *)vnullp would work,
but *(char **)&vnullp is a request to pretend that the address of vnullp is
the address of a char *, and thus this is NOT a cast of a null pointer value.
(Actually, it will work, because char * and void * are guaranteed to be the
same thing, but it wouldn't work for *(int **)&vnullp, whereas (int *)vnullp
would.)
(I think...)
Newsgroups: comp.lang.c,comp.windows.ms.programmer