Хрестоматия по программированию на Си в Unix



     дитячі брюки |          

Примеры. Хрестоматия по программированию на Си в Unix - стр. 5


void *MEMrealloc(void *ptr, size_t size){ AllocFrame *retptr; char *cptr = (char *)ptr - RedZoneTypeSize; /* прежний AllocFrame */ AllocFrame *oldptr = (AllocFrame *) cptr; int fullRedZoneTypes = (size + RedZoneTypeSize - 1) / RedZoneTypeSize; size_t adjustedSize = sizeof(retptr->red_zone) * 2 + fullRedZoneTypes * RedZoneTypeSize;

/* Проверить сохранность того, что мы сейчас будем realloc-ить */ MEMcheck_consistency(oldptr);

retptr = (AllocFrame *) realloc((void *)oldptr, adjustedSize); if(retptr == NULL) return NULL;

MEMmakeRedZones ((char *) retptr, size, adjustedSize); MEMputTableRecord(retptr, oldptr, size, adjustedSize); return &retptr->stuff[0]; }

void *MEMcalloc(size_t n, size_t size){ size_t newsize = n * size; void *ptr = MEMmalloc(newsize); memset(ptr, '\0', newsize); return ptr; }

/* Очистка отведенной памяти. * ptr - это указатель не на AllocFrame, * а на данные - то есть на stuff[0]. */ void MEMfree(void *ptr){ char *cptr = (char *)ptr - RedZoneTypeSize; int i, code;

code = MEMcheck_consistency((AllocFrame *) cptr); for(i=0; i < RedZoneTypeSize; i++) cptr[i] = free_table[i];

if(code != FREED) free((void *) cptr);

MEMputTableRecordKilled((AllocFrame *) cptr); }

/* ============================================================= */ /* Тестовый пример */ /* ============================================================= */ #define MAXPTRS 512 char *testtable[MAXPTRS];

/* Сгенерировать строку случайной длины со случайным содержимым */ char *wildstring(int c){ #define N 1024 char teststring[N + 1]; int len, i; char *ptr;

len = rand() % N; for(i=0; i < len; i++) teststring[i] = c; teststring[len] = '\0';

ptr = (char *) MEMmalloc(len + 1); if(ptr){ strcpy(ptr, teststring); } else printf("NULL wildstring()\n");

return ptr; }

int main(int ac, char *av[]){ int ilen, len, n, i;

srand(time(NULL));

for(n=0; n < MAXPTRS; n++) testtable[n] = wildstring('A');

#define DAMAGE (MAXPTRS/3*2-1) #ifdef DAMAGE /* Навести порчу */ len = strlen(testtable[DAMAGE]); testtable[DAMAGE][len+1] = 'x'; testtable[DAMAGE][-2] = 'y'; printf("ptr=%p len=%d\n", testtable[DAMAGE], len); #endif for(n=0; n < MAXPTRS/2; n++){ char *p = wildstring('B'); int length = strlen(p); char *ptr;

i = rand() % MAXPTRS; /* Не забыть присвоить возвращенное realloc() значение * обратно в testtable[i] !!! */ testtable[i] = ptr = (char *) MEMrealloc(testtable[i], length + 1);

if(ptr == NULL) printf("Не могу сделать realloc()\n"); else strcpy(ptr, p);

#ifdef DAMAGE /* Порча */ if(n == MAXPTRS/3){ ptr[length+2] = 'z'; } #endif MEMfree(p); }

for(n=0; n < MAXPTRS; n++){ if(testtable[n]) MEMfree(testtable[n]); } #ifdef DAMAGE MEMfree(testtable[DAMAGE]); #endif return 0; }

© Copyright А. Богатырев, 1992-95
Си в UNIX

| |




Содержание  Назад  Вперед