[comp.lang.c] THINK C calloc

hsu_wh@jhunix.HCF.JHU.EDU (William H Hsu) (07/23/90)

	I have encountered a very elusive calloc() quirk which did not
appear when I first developed my project on a UNIX C system.  Below is what
I believe is the offending block, dropped into a new test file:

#include <stdio.h>

#define UNIT	100

typedef int **MATRIX;

void main()
{
	int i, size=20;
	MATRIX table;
	if (table = (MATRIX)calloc(size, sizeof(int *)))
	{
	    for (i = 0; i < size; i++)
	    {
    		table[i] = (int *)calloc(2, sizeof(int));
    		table[i][0] = UNIT*i;
    		printf("### %d\t%d\t%d\n", i, UNIT*i, table[i][0]); 
		}
	}
}

	This block gave no trouble on the UNIX system and came straight from
Kernighan and Ritchie and Kelley and Pohl's suggested methods for dynamic
allocation of a 2-D array.  I have successfully removed the segment to
another function in the "real" program (using triple indirection).  The Mac
doesn't complain at all until runtime, when it reaches the printf statement.
In the above version, it apparently skips out of the for loop completely;
other versions where usage of the calloc'ed array is attempted induce a bomb
(frozen mouse, etc.) - worse still, some versions only bomb on the first
run!  Commenting-out the printf statements seems to prevent a crash, but of
course, leaves me blind as to the results of the allocation.  I am fairly
certain that the second calloc (the one in the loop) is the bad one, and
putting an "if (! table[i] .... ))" in the loop seems to verify this.
	My question: why would this very standard array allocation work
perfectly on a mainframe, but crash spectacularly when ported to a
Macintosh?  The differences in "int" (size 4 on the UNIX machine and 2 on
the Mac) and "int **" (both size 4 bytes) don't seem to make a difference.
Could someone suggest a more universal allocation scheme, one which would
run on either system?
	Please E-mail responses to: hsu_wh@jhunix.hcf.jhu.edu (BITNET)
				    hsu@cs.jhu.edu (APRAnet)