/** * C++ nezna nic jako realloc(), takze se musi misto toho naalokovat nove pole * prekopirovat obsah a uvolnit stare pole. * realloc() zkusi zvetsit pamet na miste v heapu, kde se nachazi. Lze pouze * pokud v heapu pamet za pointerem je volna. Pokud to nejde hleda jine misto a * pote tam nakopiruje puvodni. => realloc je efektivnejsi nez free+malloc. * Kdyz realloc dostane NULL jako prvni parametru funguje jako malloc. */ void stack_push(stack *s, void *elem_addr) { if (s->logical_length == s->allocated_length) { StackGrow(s); } /* V nasledujicim copy funkci musim pretypovat s->elem na (char*) jinak kompilator by mohle delat blbe pointer aritmetiku... a kvuli citelnosti */ memcpy(((char *)s->elem) + (s->logical_length * s->elem_size), elem_addr, s->elem_size); s->logical_length++; }
void StackPush(Stack *s, void *elemAddr) { if (s->logLength == s->allocLength) StackGrow(s); void *target = (char *)s->elems + s->logLength * s->elemSize; memcpy(target, elemAddr, s->elemSize); s->logLength++; }