I am a beginner at coding and have a problem with my code. please advice.
Input:-
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int *list = malloc(3 * sizeof(int));
if (list == NULL)
{
return 1;
}
list[0] = 1;
list[1] = 2;
list[2] = 3;
for (int i = 0; i < 3; i++)
{
printf("%i\n", list[i]);
}
int *tmp = realloc(list, 4 * sizeof(int));
if (tmp == NULL)
{
free(list);
return 1;
}
free(list);
tmp[3] = 4;
list = tmp;
for (int i = 0; i < 4; i++)
{
printf("%i\n", list[i]);
}
free(tmp);
}
Output:-
1
2
3
1628405245
5
-136327152
4
I am having a problem with free(list); if i remove it, then the code seems to work fine,
but if i do this (Which is done in CS50's lecture)
tmp[3] = 4;
free(list);
Then the error comes
1
2
3
1508201014
5
1428381712
21918
free(): double free detected in tcache 2
zsh: abort ./list1
Why is this please Explain?
According to the C Standard (7.22.3.5 The realloc function)
and
Thus the last call of free in this code snippet
invokes undefined behavior because the memory for the old object pointed to by the pointer list was already freed in this successful call of realloc
You need to remove the last call of free in this code snippet.
Also in this code snippet
the call of free invokes undefined behavior by the same reason.
Pay attention to that realloc can return the same address of the reallocated memory or a new address of the reallocated memory. This can influence on the result of undefined behavior.