在c中重新分配2d数组

时间:2016-02-03 19:36:25

标签: c arrays allocation

我想重新分配一个二维数组,以便第二个数组中的数组变得更大,所以我想存储的东西比我想要存储的数组大,我想让数组更大。问题是我真的不知道该怎么做。我让它编译没有错误,但在Valgrind我看到了很多内存错误,所以我做错了。我看到a previous question about this here但我并不是真的理解它,所以对于如何做到这一点的任何帮助和解释都将非常感激。

到目前为止,我有这个。

int **create2darray(int a, int b) {
  int i;
  int **array;

  array = malloc(a * sizeof(int *));
  assert(array != NULL);
  for (i = 0; i < a; i++) {
    array[i] = calloc(b, sizeof(int));
    assert(array[i] != NULL);
  }
  return array;
}

int **reallocArray(int **array, int size, int i) {
  int i;
  int **safe_array;
  safe_array = realloc(*array ,2 * size);
  assert(safe_array != NULL);
  array = safe_array;
  return array;
}

void free2DArray(int **array, int m) {
  int i;
  for (i = 0; i < m; i++) {
    free(array[i]);
  }
}


int main(int argv, char *argc[]) {
  int i;
  int size;
  int **testArray = create2darray(1, 10);
  size = 10;
  for(i = 0; i < size; i++) {
    testArray[0][i] = 2;
  }
  testArray[0] = reallocArray(testArray, size, 0);
  size = 2 * size;
  for(i = 9; i < size; i++) {
    testArray[0][i] = 3;
  }
  for(i = 0; i < size; i++) {
    printf("%d", testArray[0][i]);
    free2DArray(testArray, size);
  }
  return 0;
}

2 个答案:

答案 0 :(得分:0)

Free2DArray()中,您free()各个整数数组,但不是&#34;外部&#34;包含整数指针的数组的维数。 您可以在循环之后向free()添加另一个调用来处理它。

main()

for(i = 0; i <size; i++) {
    printf("%d", testArray[0][i]);
    free2DArray(testArray, size);
}

你将多次free() - (内部)整数数组。 对free2DArray()的调用应该在循环之外。

答案 1 :(得分:0)

你需要一个函数reallocArray来重新分配外部数组和所有内部数组。 适应你的代码如下:

#include <malloc.h> 

int **reallocArray( int **array, int oldSizeA, int newSizeA, int newSizeB )
{
    // realloc the array of pointers ( allocates new memory if array == NULL )
    int **safe_array = realloc( array, newSizeA * sizeof( int* ) );
    assert(safe_array != NULL);
    if ( safe_array == NULL )
        return array;
    array = safe_array;

    // realloc the inner arrays of int ( allocates new memory if i >= oldSizeA )
    for ( int i = 0; i < newSizeA; i ++ )
    {
        int *temp = NULL;    // allocate new memory if i >= oldSizeA
        if ( i < oldSizeA )  
            temp = array[i]; // reallocate array[i] if i < oldSizeA

        temp = realloc( temp, newSizeB * sizeof( int ) );
        assert( temp != NULL );
        if ( temp == NULL )
            return array;
        array[i] = temp;
    }
    return array;
}

在函数reallocArray中使用函数create2darray来创建数组。如果ralloc的输入参数为NULL,则会分配新的动态内存。

int **create2darray( int sizeA, int sizeB )
{
    return reallocArray( NULL, 0, sizeA, sizeB );
}

首先你必须在循环中free内部int数组,然后你必须free指针数组:

void free2DArray( int **array, int sizeA )
{
    for (int i = 0; i < sizeA; i ++)
       free( array[i] );
    free( array );
}


int main( int argv, char *argc[] ){

    int sizeA = 1;
    int sizeB = 10;
    int **testArray = create2darray( sizeA, sizeB );
    for ( int i = 0; i < sizeB; i++ ) {
        testArray[0][i] = 2; 
    }

    int oldSizeA = sizeA;
    int oldSizeB = sizeB;
    sizeB = 2*sizeB;
    testArray = reallocArray( testArray, oldSizeA, sizeA, sizeB );
    for( int i = oldSizeB; i < sizeB; i++ ) {
        testArray[0][i] = 3;
    }

    for( int i = 0; i < sizeB; i++ ) {
        printf("%d", testArray[0][i]);
    }

    free2DArray(testArray, sizeA );
    return 0;
}