#include #include #include #include #include // // 'tstheap.c' // Tests out malloc, calloc, realloc, and mfree. // // 05/22/92 DarekM Created // #define max(a,b) ((a > b) ? a : b ) int main(int argc, char *argv[]) { int l; // loop counter int t; // total memory allocated int c; // count of blocks int i; // current block index void *p; // address of block int numblocks; int delta; void **rgp; // array of memory pointers int fDEBUG = 0; if (argc < 3) { printf("Usage: tstheap [DUMP]\n\n"); return; } else if (argc > 3) fDEBUG = 1; numblocks = max(1, atoi(argv[1])); delta = max(1, atoi(argv[2])); rgp = malloc(numblocks * sizeof(void *)); printf("TstHeap: numblocks = %d, delta = %d\n\n", numblocks, delta); for (l = 0; ; l++) { t = c = 0; printf("PASS #%d\n", l); for (i = 0; i < numblocks; i++) { int cb; if (i & 1) p = malloc(cb = i + l*delta + 1); else p = calloc(cb = i + l*delta + (rand() & 255) + 1, 1); if (p == NULL) { printf("p == NULL\n"); break; } if (((int)p < 0x1000) || ((int)p < 0)) { printf("WIERD P == %d\n", p); break; } rgp[i] = p; t += cb; if (fDEBUG) printf(" %d,%02d: Alloced $%08X\n", l, i, p); } if ((c = i) == 0) break; printf(" Blocks alloced: %d Bytes: %d\n", c, t); for (i = 0; i < c; i++) { rgp[i] = p = realloc(rgp[i], 1); if (fDEBUG) printf(" %d,%02d: Realloced $%08X\n", l, i, p); } printf(" Blocks realloced: %d\n", i); for (i = 0; i < c; i++) { free(rgp[i]); if (fDEBUG) printf(" %d,%02d: Freed $%08X\n", l, i, rgp[i]); } printf(" Blocks freed: %d\n\n", i); } printf("\n\n"); free(rgp); return 1; }