【问题标题】:reallocation of 2d arrays in cc中二维数组的重新分配
【发布时间】:2016-02-03 19:36:24
【问题描述】:

我想重新分配一个二维数组,以便第二个数组中的数组变得更大,所以我想要存储的东西比我想要存储它们的数组更大,我想让数组更大。问题是我真的不知道该怎么做。我让它编译没有错误,但是在 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;
}

【问题讨论】:

  • 你遇到了什么错误?
  • 不太清楚你想要重新分配什么或者reallocArray的最后一个参数是什么。目前,您只重新分配第一行。当您希望整个数组增长时,您必须像在createArray 中一样进行两级重新分配。
  • 你是想说增加数组的列数吗?

标签: c arrays allocation


【解决方案1】:

您需要一个函数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;
}

在你的函数create2darray 中使用函数reallocArray 来创建你的数组。如果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;
}

【讨论】:

  • 我忘了第二个免费的。我现在解决了这个问题,但我不明白最后一个 if 语句。 if 语句永远无法正常工作?如果 temp 为 idd NULL,则断言将中断,但代码本身非常好。我不知道指针必须是临时安全的,所以谢谢:D (temp = realloc( temp, newSizeB * sizeof( int ) ); assert( temp != NULL ); if ( temp == NULL ) return array; array[i] = temp; } return array; }
【解决方案2】:

Free2DArray() 中,您free() 是单个整数数组,但不是包含整数指针的数组的“外部”维度。 您可以在循环之后添加另一个对 free() 的调用来处理这个问题。

main():

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

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

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 2013-11-30
    • 2018-05-26
    相关资源
    最近更新 更多