代码之家  ›  专栏  ›  技术社区  ›  Rub3n

c语言中二维数组的重新分配

  •  1
  • Rub3n  · 技术社区  · 9 年前

    我想重新分配一个2d数组,这样第二个数组中的数组会变大,所以我想存储的东西会比我想存储它们的数组大,我想让数组更大。问题是我真的不知道该怎么做。我让它编译时没有错误,但在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 回复  |  直到 9 年前
        1
  •  0
  •   Rabbid76    9 年前

    你需要一个功能 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 以创建阵列。如果输入参数 ralloc NULL ,则分配新的动态存储器。

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

    首先你必须 free 循环中int的内部数组,则必须 自由的 指针数组:

    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;
    }
    
        2
  •  0
  •   Jim Lewis    9 年前

    在里面 Free2DArray() free() 单个整数数组,但不是包含整数指针的数组的“外部”维度。 您可以向添加另一个呼叫 免费() 在循环之后处理。

    在里面 main() :

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

    你会结束的 免费() -多次迭代(内部)整数数组。 呼叫 free2DArray() 应该在循环之外。