1

我必须编写一个函数,在指针数组的末尾添加一个地址。这是我所做的。我想知道我做得对不对,如果不对,请纠正我。

#include <stdio.h>
#include <stdlib.h>
#define MAX 3

void add( int *array[MAX], int *addr)
{
    array = realloc(array, 1*sizeof(int));
    array[MAX+1] = addr;
}

int main()
{
    int *addr = 4;
    int *array[MAX] = {"1","2","3"};
    add(array, addr);
    int i;
    for(i = 0; i<4;i++)
        printf("%d ", array[i]);

    return 0;
}
4

1 回答 1

1

来自 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;
}
于 2015-08-30T08:44:56.410 回答