tarr-michael@CS.YALE.EDU (michael tarr) (09/19/90)
For some reason using THINK C 4.02 the following calloc (at the end of the code segment) breaks. It returns a pointer that is not really valid (but not NULL). Here are the data structures used: struct objects { short theObj; Rect theRect; RGBColor theColor; Point thePen; struct objects *next_object; }; typedef struct objects objects; struct picts { char* thePict; struct picts *next_pict; }; typedef struct picts picts; struct symbolList { char* theSym; objects *symObj; picts *symPict; struct symbolList *next_symbol; }; typedef struct symbolList symbolList; symbolList *symbols; objects *objPtr; picts *pictPtr; symbolList *symPtr; /*** OpenSymbolFile ***/ extern void OpenSymbolFile(char*); void OpenSymbolFile(char* symFile) { FILE* symfp; char inStr[80], tempStr[30]; char graphOp[15]; RGBColor penColor = { 0x0000, 0x0000, 0x0000 }; Point penDim = { 1 ); FatalError(); } symbols = 0; while ( fscanf(symfp, "%s", inStr) != EOF ) { if (symbols == 0) { if ( !ValidPointer( (Ptr) (symbols = (symbolList*) calloc( (size_t) 1, (size_t) sizeof(symbolList) )) ) ) { /*^^^^^^ bad calloc -- any ideas? */ ErrorHandler( "OpenSymbolFile", "Failed calloc for symbolList at:", inStr, FATAL_ALERT ); FatalError(); } symbols->next_symbol = 0; symPtr = symbols; } Any ideas? Mike Tarr tarr@cs.yale.edu -- * Mike Tarr The Human Neuron Project * * tarr@cs.yale.edu Department of Psychology * * "My opinions are always my own." Yale University * **************************************************************************
rcfische@polyslo.CalPoly.EDU (Ray Fischer) (09/20/90)
tarr-michael@CS.YALE.EDU (michael tarr) writes ... >For some reason using THINK C 4.02 the following calloc (at the end of the >code segment) breaks. It returns a pointer that is not really valid (but not >NULL). Here are the data structures used: I've not copied your code in this reply, but nowhere do I see either a #include <stdlib.h> or a void *calloc(); With Think C (and possibly other C compilers) a definition for the calloc (and alloc, et al) function is required or you will get bad results. The reason is that the default return value for a function is an int. In Think C an int is just 16 bits. Thus, without any declaration to the contrary, Think C will take the 32-bit address returned, expand the low-order 16-bits to 32 bits, then assign that value to your pointer. The solution is simply to tell the compiler that calloc returns a 32-bit result. Ray Fischer rcfische@polyslo.calpoly.edu