Help with malloc() ...

gwyn at BRL-VLD.ARPA gwyn at BRL-VLD.ARPA
Sun Aug 19 15:49:10 AEST 1984

From:      Doug Gwyn (VLD/VMB) <gwyn at BRL-VLD.ARPA>

malloc() is most efficient if you allocate the needed space all at
once, rather than a "byte" (actually, you seem to mean "integer
datum") at a time.  The simplest code to do what I think you want is:

#include	<stdio.h>
	typedef char	*generic;	/* generic pointer type, (void *)
					   after ANSI C committee is done */
	extern generic	calloc();	/* layer around malloc() */
	extern void	free();

	void		Fatal();	/* prints error message & aborts */

	typedef int	datum;		/* more often, a struct */
	int		ndata;		/* # data records to allocate */
	register datum	*dp;		/* -> allocated array */
	register int	i;		/* index data array */
	register FILE	*fp;		/* data file stream pointer */

	/* <get buffer size into `ndata' somehow> */

	if ( (dp = (datum *)calloc( ndata, sizeof(datum) )) == NULL )
		Fatal( "ran out of memory" );	/* always check! */

	/* <get data file open on stream `fp' somehow, e.g. fopen()> */

	for ( i = 0; i < ndata; ++i )
		if ( fread( (char *)&dp[i], (int)sizeof(datum), 1, fp ) != 1 )
			Fatal( "error reading data" );
	/* this is just an example; in this case you could have had:
	if ( fread( (char *)dp, (int)sizeof(datum), ndata, fp ) != ndata )
		Fatal( "error reading data" );
	... and avoided the loop altogether			    */

	/* <compute with data now in buffer, using dp[i] to access
	    the i-th element of the array>			   */

	free( (generic)dp );		/* "waste not, want not" */

calloc() is just a simple layer around malloc() to take care of
multiplying the number of items by the size of each; it also fills
the allocated storage full of 0s which makes debugging less messy.

More information about the Comp.lang.c mailing list