Novice C question

Michael Coffin mhcoffin at tolstoy.waterloo.edu
Wed Apr 17 01:12:20 AEST 1991


In article <31969 at usc> ajayshah at almaak.usc.edu (Ajay Shah) writes:
>Consider this fragment of C code (from Numerical Recipes):
>
>1	double *dvector(nl,nh)
>2	int nl,nh;
>3	{
>4	        double *v;
>5	
>6	        v=(double *)malloc((unsigned) (nh-nl+1)*sizeof(double));
>7	        if (!v) nrerror("allocation failure in dvector()");
>8	        return v-nl;
>9	}
>
>It's supposed to be a function which allocates a vector of
>doubles.  My interpretation of nl and nh is: they're array
>indexes.  If you want to allocate an array going from 5 to 10,
>you would say p = dvector(5, 10).
>
>Question: what is happening on line 8?  Why is he not just
>returning v (a pointer)?  What is the meaning of subtracting nl
>(an int) from v without any casting?

The intention is to return a pointer to a phantom array location nl
spaces to the "left" of the leftmost space actually allocated, so that
after calling, for example, 
    d = dvector(2,4)
d[2],d[3], and d[4] would be within the space actually allocated.

Although this will work with many C compilers, the ANSI standard does
not give its blessing.  A compiler is entitled to produce code
that issues an error message or dumps core when it evaluates the
expression "v-nl" for positive nl.

Michael Coffin				mhcoffin at watmsg.waterloo.edu
Dept. of Computer Science		office: (519) 885-1211
University of Waterloo			home:   (519) 725-5516
Waterloo, Ontario, Canada N2L 3G1



More information about the Comp.lang.c mailing list