A C debugging puzzle

utzoo!decvax!ittvax!tpdcvax!bobvan utzoo!decvax!ittvax!tpdcvax!bobvan
Fri Nov 5 12:13:00 AEST 1982

In the spirit of the recent C puzzles book, here is one to think about:

Given that we have declarations

	#define	SIZE	10

	int	array[SIZE];
	int	i, *ip;

most C programmers recognizes that the following construction clears
the array:

	for (i=0; i<10; i++)
		array[i] = 0;

Most experienced C programmers have learned to recognize the following
construction as a more efficient alternative:

	for (ip=array; ip<&array[10]; ip++)
		*ip = 0;

Using pointers doesn't save much on a machine like a VAX that has
indexing hardware, but makes a world of difference on an 8080.

Now suppose that we extend this to a two dimensional array:

	#define	XSIZE	10
	#define	YSIZE	10

	int	array2d[XSIZE][YSIZE];
	int	*ip;

	for (ip=&array2d[XSIZE][YSIZE]; ip<&array2d[XSIZE][YSIZE]; ip++)
		*ip = 0;

I recently got bitten making this hasty generalization and will feel
better if someone else has to think about for a while to see the
error.  Can you see the bug in the above fragment?  It is a shame that
I have to ask you not to reply to the net.  Mail to me and I'll post a
tally of the answers in a few days.  Comments about the appropriateness
of such puzzles are welcome.

				Bob Van Valzah

More information about the Comp.lang.c mailing list