我目前正在编写一个函数,该函数使用指向结构cell
的二维数组指针。我必须使用文件中读取的数据更新每个cell
。
因为我需要访问各种单元格,所以我必须处理动态分配。但是在这里使用它的最佳方法是什么,因为我不需要访问数组本身?我可以使用:
cell *p_cell[height][width] = malloc(height*width*sizeof(cell*));
或者:
cell *p_cell[height][width];
然后稍后(例如在for循环中):
p_cell[i][j] = malloc(sizeof(cell*));
答案 0 :(得分:4)
data_type (*array) [width] = malloc( sizeof(data_type[height][width]) );
现在您可以使用arr[i][j]
P.S:应该将2-D数组分配为连续的内存块,以获得最佳的读写性能。
**编辑:**正如评论部分中的chux所指出的,array
不是二维数组,它是指向一维数组的指针。
为了使array
成为二维数组,你需要像这样声明它。
data_type (*array) [height][width] = malloc( sizeof(data_type[height][width]) );
答案 1 :(得分:2)
看起来你想要一个2D数组指针,可以声明为:
cell *p_cell[height][width];
要在cell *
中分配每个p_cell[i][j]
指针,您可以这样做:
for (size_t i = 0; i < height; i++) {
for (size_t j = 0; j < width; j++) {
p_cell[i][j] = malloc(sizeof(cell));
/* check malloc */
/* access using p_cell[i][j]->something */
}
}
答案 2 :(得分:2)
以下是分配2D数组的两种方法:
cell *(*p_cell)[height][width] = malloc(sizeof(*p_cell));
p_cell
是指向cell
个对象的2D数组的指针。使用以下符号检索坐标i
,j
处的项目。
cell *p = (*p_cell)[i][j];
使p_cell
成为指向数组数组的指针可能更容易:
cell *(*p_cell)[][width] = malloc(height * sizeof(*p_cell));
您可以使用
获取坐标i
,j
的项目
cell *p = p_cell[i][j];
上述数组未初始化,您需要使用指向现有cell
对象的指针或指向已分配cell
对象的指针初始化它们。
如果2D数组仅在函数中本地使用且尺寸width
和height
不是太大,则可以使用本地存储定义2D数组:
cell *p_cell[height][width];
由于width
和height
是动态值,因此静态初始化不可用。您必须使用嵌套循环初始化此数组,例如已分配的循环。
问题是:你真的需要元素类型作为cell
的指针吗?。仅当您要使某些指针指向同一对象或具有空值或指向其他地方引用的cell
对象时,它才有用。否则,使用cell
对象数组会更容易,这些对象可以是函数的本地对象,也可以使用malloc()
或calloc()
分配:
cell p_cell[][width] = calloc(sizeof(*p_cell), height);