hellazari hellazari - 3 months ago 15
C Question

Decreasing realloc

I have a few questions about understanding

realloc
behavior.

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *str;

/* Initial memory allocation */
str = malloc(5 * sizeof(int));
*str = 1;
*(str + 1) = 2;
*(str + 2) = 3;
*(str + 3) = 4;
*(str + 4) = 5;

/* Reallocating memory */
int i, j;

for (i = 5; i > 0; i--) {
str = realloc(str, i * sizeof(int));

for (j = 0; j < i; j++) {
printf("%d", *(str + j));
}

printf("\n");
}

free(str);

return(0);
}



  1. In this code example, can I be sure that a smaller
    realloc
    will drop the highest number?

  2. Is the
    realloc
    is only freeing the last memory and keeping the same address in
    str
    ? Or may the address change even though it's getting smaller and for sure have space in the current place?


Answer
  1. Yes. If you have a memory block p of size N and you do realloc(p, M), then (assuming realloc succeeds), the result will contain the first min(N, M) bytes from p.

  2. The address can change, even if the new size is smaller than the old one. realloc simply makes no guarantees about this case (it can even fail).