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浮点数组,然后整个数组? ?
一般规则是,每次调用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)
当然,用适当的变量替换定义。
通过这样做,您将: