Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What would realloc do if there is no sequential space of memory?

realloc is used to reallocate the memory dynamically.

Suppose I have allocated 7 bytes using the malloc function and now I want to extend it to 30 bytes.

What will happen in the background if there is no sequential (continously in a single row) space of 30 bytes in the memory?

Is there any error or will memory be allocated in parts?

like image 697
Sambhav jain Avatar asked Sep 10 '10 11:09

Sambhav jain


People also ask

Does realloc erase memory?

No, the data will be copied for you into the new block that the returned p points at, before the old block is freed. This all happens before realloc returns, so the new p points to your data still.

Does realloc initialize memory to zero?

Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed to be the pointer passed through the memblock argument. realloc does not zero newly allocated memory in the case of buffer growth.

Does realloc automatically free memory?

If realloc succeeds, it will take ownership of the incoming memory (either manipulating it or free ing it) and return a pointer that can be used ("owned") by the calling function. If realloc fails (returns NULL ), your function retains ownership of the original memory and should free it when it's done with it.

Does realloc change memory address?

The realloc function changes the size of the block whose address is ptr to be newsize . Since the space after the end of the block may be in use, realloc may find it necessary to copy the block to a new address where more free space is available. The value of realloc is the new address of the block.


2 Answers

realloc works behind the scenes roughly like this:

  • If there is enough free space behind the current block to fulfill the request, extend the current block and return a pointer to the beginning of the block.
  • Else if there is a large enough free block elsewhere, then allocate that block, copy the data from the old block over, free the old block and return a pointer to the beginning of the new block
  • Else report failure by returning NULL.

So, you can test for failure by testing for NULL, but be aware that you don't overwrite the old pointer too early:

int* p = malloc(x);
/* ... */
p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */
/* Correct way: */
{
  int* temp = realloc(p, y);
  if (NULL == temp)
  {
    /* Handle error; p is still valid */
  }
  else
  {
    /* p now possibly points to deallocated memory. Overwrite it with the pointer
       to the new block, to start using that */
    p = temp;
  }
}
like image 165
Bart van Ingen Schenau Avatar answered Sep 29 '22 12:09

Bart van Ingen Schenau


realloc will only succeed if it can return a contiguous ("sequential" in your words) block of memory. If no such block exists, it will return NULL.

like image 41
RichieHindle Avatar answered Sep 29 '22 11:09

RichieHindle