realloc primer
    Mark Brader 
    msb at sq.sq.com
       
    Wed Feb 13 08:23:40 AEST 1991
    
    
  
In an otherwise excellent article, Steve Summit (scs at adam.mit.edu) writes:
> The transformation from fixed-size to dynamically-allocated is
> simple: just change the array to a pointer, and add another
> variable keeping track of how many slots have been allocated.
> (... you [may not] even need the extra variable. ...)
> 
> With one exception, no appearances of the global array (which is
> now actually a pointer) in the rest of the code have to be
> changed, because pointers can be subscripted the same as arrays ...
> One thing to beware of when using realloc is that the array can
> (and usually will) move around in memory, invalidating any other
> pointers to elements within it.  (This is the "one exception" I
> alluded to above.)
There is in fact a second important exception: sizeof.  For instance,
given "int arr[N];", some people prefer to write
		if (i < sizeof arr / sizeof arr[0])
			arr[i++] = new_item;
		else
			error...;
rather than
		if (i < N)
			arr[i++] = new_item;
		else
			error...;
because in the second form you have to look back to the declaration to
verify that that N means what you think it does.  And such expressions
may occur in other places, such as loop headers.
A still worse case is this one:
		if (restoring)
			fread (arr, sizeof arr, 1, fp);
		...;
		if (saving)
			fwrite (arr, sizeof arr, 1, fp);
Here the *file format* was designed for a fixed-size array, and if it is
to be replaced by a dynamic one, the format will have to be changed so
that a count can be read from the file before the array itself.
And while you're fixing *those* problems, you can also correct the fread
and fwrite calls, which should probably look more like this:
			count = fread ((char *) arr, size, 1, fp);
			if (count < 1) {
				fprintf (stderr, "%s: error reading %s..."...);
				exit(1);
			}
(In ANSI C the type "char *" becomes "void *", and the cast can be
removed anyway if a prototype is in scope.  Whether it is desirable
is a matter of style.  It's harmless to leave a char * cast in anyway.)
-- 
Mark Brader			"It's simply a matter of style, and while there
SoftQuad Inc., Toronto		 are many wrong styles, there really isn't any
utzoo!sq!msb, msb at sq.com	 one right style."	-- Ray Butterworth
This article is in the public domain.
    
    
More information about the Comp.lang.c
mailing list