基本上,我想要一个可以放置数据和数组的结构。
我知道使用 int** 然后 malloc 一个指针数组的方法。 然后在每个指针处进行 malloc。
但这不是我想要的。原因是从技术上来说,这会更慢,因为(某些东西缓存)。
此外,它还允许数据不碎片化。
如果我让它运行,我将拥有创建可以放置在结构中的动态二维数组的明确最佳方法。
这是即将完成的代码示例。
我知道这与已经提出的问题相似,甚至与我之前提出的问题相似,但我要求的是不同的答案。
(在堆(动态内存、malloc...)上创建任意大小(行、列)的二维数组的最佳方法是什么,使得该数组是可以包含在struct。如果数据可以连续存储在内存上,那就加分了。)
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int *(data)[];
} iMAT;
iMAT* create_matrix(int row, int col) {
iMAT* matrix = malloc(sizeof(iMAT));
int (*arr)[row] = malloc(sizeof(int[col][row]));
matrix->row = row;
matrix->col = col;
matrix->data = arr;
return matrix;
}
int main() {
int row = 5;
int col = 5;
iMAT* matrix = create_matrix(row, col);
return 0;
}
最佳答案
这不会编译,因为这个结构成员:
int *(data)[];
是一个指针数组,意思是这样的:
matrix->data = arr;
这是不允许的数组赋值。您想要的是一个指向未指定大小的数组的指针:
int (*data)[];
但请注意,您将无法直接访问数组成员,因为指向的类型不完整。要读取或写入数组的成员,您需要将其转换为正确的类型:
((int (*)[matrix->cols])matrix->data)[1][2] = 4;
或者将其分配给正确类型的临时变量并使用它:
int (*data)[matrix->col] = matrix->data;
data[1][2] = 4;
关于arrays - C 指向 int(*)[row] 类型的动态数组的指针,其中 row 在结构内部未分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76028561/