【问题标题】:Allocate and free 2D array in C using void使用 void 在 C 中分配和释放二维数组
【发布时间】:2014-03-16 17:10:02
【问题描述】:

这个想法是只使用两个函数,它们可以分配和释放在编译时未知的给定数据类型的二维数组。我在释放函数中编写的代码崩溃了,但我不明白为什么。代码如下:

void** new2DArray(int row, int col, int typeSize){
    void** temp = malloc(sizeof(void*)*row); //EDIT                     
    for (row-=1; row >= 0; row--)                               
        temp[row] = malloc(typeSize*col);
    return temp; 
}


void free2DArray(void** array, int row, int typeSize){
    for (row -= 1; row >= 0; row--)
        free( *(array + row*typeSize) );
     free(array); 
}

对于 3x3 数组,其中 is 将被称为:

double** test = (double**) new2DArray(3, 3, sizeof(double));
free2DArray(test, 3, sizeof(double));

释放功能有什么问题吗?

【问题讨论】:

  • free2DArray 中转换arraydouble ** 不是更容易吗?
  • 当然,如果您总是要使用double 数组。关键是要有一个通用函数,您可以在其中创建int 2D 数组、unsigned short 或任何东西。我让这一切只适用于一种数据类型。

标签: c malloc multidimensional-array


【解决方案1】:

free2DArray 看起来不对。您不需要知道类型的大小;您只需释放您分配的块:

void free2DArray(void** array, int row){
    for (row -= 1; row >= 0; row--)
        free( array[row] );
     free(array); 
}

【讨论】:

  • 我最初有这个,但是必须知道指针的大小才能相应地增加。现在我想起来了,sizeof(void*) 无论如何都应该与任何其他指针数据类型相同。
  • 您只需要知道sizeof(void*),因为您只遍历第一个维度,而不是第二个维度。
【解决方案2】:

为什么不按照分配的方式释放它?

for (row-=1; row >= 0; row--)                               
        free(array[row]); 
      //free(*(array + row)); <- or the way you are doing it
free(array);

【讨论】:

  • 现在 sizeof(void*) = sizeof(double*) 还是有意义的。它会起作用的。我用 sizeof(void*) = 1 的概念写了这个,所以我手动添加了增量长度。
【解决方案3】:

您使用free(*(array + row*typeSize)); 释放列数组。但是,它应该是free(*(array + row)),或更简洁地说,free(array[row])array + row*typeSize 让您跳过 typeSize 每次迭代的列向量数,因此,从未分配过的“空闲”列。

【讨论】:

  • 我现在看到了这个错误。我的意思是按照你说的做,而不是增加数组中数据类型的大小。
  • 它不应该是array + row*sizeof(void*),因为 C 指针算法隐式地将偏移量乘以指针指向的类型的大小。应该只是array + row
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2011-08-05
  • 2020-01-18
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多