来自 realloc 的手册:
realloc() 函数将 ptr 指向的内存块的大小更改为 size 字节。内容将在从区域开始到新旧大小的最小值的范围内保持不变。如果新大小大于旧大小,则不会初始化添加的内存。如果 ptr 为 NULL,则对于所有 size 值,调用等效于 malloc(size);如果 size 等于 0,并且 ptr 不为 NULL,则调用等效于 free(ptr)。除非 ptr 为 NULL,否则它一定是由先前对 malloc()、calloc() 或 realloc() 的调用返回的。如果指向的区域被移动,则执行 free(ptr)。
如果它太长,阅读不好解释。
首先,您应该在分配内存之后使用 realloc(例如使用 malloc),而不是在本地声明之后
其次,您将指向 int ( int * ) 的指针视为我们是 int。也显示为警告
例子:
int *addr = 4;
int *array[MAX] = {"1","2","3"};
array = realloc(array, 1*sizeof(int)); // here you're using sizeof( int )
另一个问题是超出数组范围
array[MAX+1] = addr;
对于具有 3 个空格的数组 - 您有数组 [0]、数组 [1] 和数组 [2]。
在这一行中,您试图到达大小为 4 的数组(假设是)的数组 [4] --> 超出范围
我为此建议的代码是:
代码已编辑
#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;
}