正确的方法来分配和释放指向数组的指针

Sta*_*aro 11 c arrays pointers

我想创建一个指向3个浮点数组的指针数组.这样做的正确方法是什么?

float *array1[SIZE]; // I think it is automatically allocated
// OR
float **array1 = calloc(SIZE, sizeof(float*));
free(array1);

for (int i = 0; i < SIZE; i++) {
    array1[i] = (float[]){0,0,0};
    // OR
    array1[i] = calloc(3, sizeof(float));
}
Run Code Online (Sandbox Code Playgroud)

那么我将如何释放数据呢?我很确定只是free(array1);不行,所以我会释放数组中的每个指针然后释放数组,或者因为我分配了三个浮点数,我会释放每个浮点数,然后每个3浮点数组,然后整个数组? ?

Dar*_*usz 2

一般规则是,每次调用malloc()calloc()您都需要free()对返回的指针进行调用

如果您想要一个编译时已知大小的二维数组,只需使用二维数组即可!float val[5][3]是完全有效的。

如果您想要一个二维数组,并且在编译时不知道它的大小,那么您很可能希望使用标准的单维 calloc() 和适当的 getter。

#define ARR_COLUMNS 10
#define ARR_ROWS 10
float* arr = calloc (ARR_COLUMNS * ARR_ROWS, sizeof(float));

int get(float* arr, int x, int y) {
  if (x<0 || x>= ARR_COLUMNS) return 0;
  if (y<0 || y>= ARR_ROWS) return 0;
  return arr[ARR_COLUMNS*y+x];
}

void set (int* arr, int x, int y, float val) {
  if (x<0 || x>= ARR_COLUMNS) return;
  if (y<0 || y>= ARR_ROWS) return;
  arr[ARR_COLUMNS*y+x] = val;
}
Run Code Online (Sandbox Code Playgroud)

当然,用适当的变量替换定义。

通过这样做,您将:

  • 节省昂贵的分配和释放成本
  • 内存碎片较少
  • 简化您可能的重新分配调用
  • 确保数据得到更好的缓存和访问,而不会出现常见的 [x][y] 与 [y][x] 迭代缓存问题。