from the manual for realloc:
The realloc() function changes the size of the memory block pointed to
by ptr to size bytes. The contents will be unchanged in the range from
the start of the region up to the minimum of the old and new sizes. If
the new size is larger than the old size, the added memory will not be
initialized. If ptr is NULL, then the call is equivalent to
malloc(size), for all values of size; if size is equal to zero, and
ptr is not NULL, then the call is equivalent to free(ptr). Unless ptr
is NULL, it must have been returned by an earlier call to malloc(),
calloc() or realloc(). If the area pointed to was moved, a free(ptr)
is done.
if its too long to read ill explain.
first of all you should use realloc after allocating memory ( using malloc for example ) and not after local declaration
second you're treating pointers to int ( int * ) as if they we're int. also shown as warning
examples:
int *addr = 4;
int *array[MAX] = {"1","2","3"};
array = realloc(array, 1*sizeof(int)); // here you're using sizeof( int )
another problem is reaching out of bound of array
array[MAX+1] = addr;
for an array with 3 spaces - you have array[ 0 ], array[ 1 ] and array[ 2 ].
in this line you're trying to reach the array[ 4 ] of an array ( that's suppose to be ) of size 4 --> out of bounds
my suggested code for this will be:
code edited
#include <stdio.h>
#include <stdlib.h>
#define MAX 3
void add( int **array[ MAX ], int *addr )
{
*array = realloc( *array, ( MAX + 1 ) * sizeof( int* ) );
(*array)[ MAX ] = addr;
}
int main()
{
int i;
int *addr;
int **array;
addr = &i;
array = malloc( MAX * sizeof ( int* ) );
for ( i = 1; i <= MAX; i++ ) {
array[ i - 1 ] = addr + 4 * i;
}
add( &array, addr );
for ( i = 0; i < MAX + 1; i++ ) {
printf( "%p ", array[ i ] );
}
return 0;
}