指针的二维数组

4

我正在编写一个函数,它使用指向结构体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*));

1
cell *p_cell[height][width] = malloc(height*width*sizeof(cell*)); 不是有效的 C 语言,因此不能使用它。也许你想使用 cell (*p_cell)[height][width] = malloc(height*width*sizeof(cell*));?在不知道应用目标的情况下,"最佳方式" 是无法确定的,需要进行广泛的讨论。 - chux - Reinstate Monica
1
这个 cell *p_cell[height][width]; 已经分配了一个大小为 heightxwidth 的指向 cell 的指针数组,即 p_cell - alk
3个回答

4
data_type (*array) [width] = malloc( sizeof(data_type[height][width]) );

现在你可以使用arr[i][j]访问数据。

提示:为了获得最佳的读写性能,应将二维数组分配为一整块连续的内存。

**编辑:** 如评论区中chux所指出的,array不是一个二维数组,而是指向一维数组的指针。

为了将array变成二维数组,你需要像这样声明它。

data_type (*array) [height][width] = malloc( sizeof(data_type[height][width]) );

1
array 不是一个二维数组,而是一个指向一维数组的指针。 - chux - Reinstate Monica
1
在编程中,“总是”这个词太绝对了。我们所做的事情没有绝对的规律。不同的平台会有不同的限制。 - StoryTeller - Unslander Monica
1
@narfi:它将是一个指向二维数组的指针。你需要使用(*array)[i][j]来访问它。 - Shravan40
1
@narfi 然后简单地使用 *array[height][width] - RoadRunner
2
为了将数组变成二维数组,...仍然不正确,因为在这里 data_type (*array) [height][width]中的array是指向二维数组的指针。你可以通过*array获得数组本身。 - alk
显示剩余4条评论

2

看起来你想要一个二维指针数组,可以这样声明:

cell *p_cell[height][width];

为了在

p_cell[i][j]中分配每个cell *指针,您可以执行以下操作:

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 */
    }
}

谢谢!这正是我想要的。在Valgrind上,我有大量的内存错误,但通过您的解决方案,已经减少到没有任何错误了! - narfi

2

下面有两种方法来分配您的二维数组:

cell *(*p_cell)[height][width] = malloc(sizeof(*p_cell));

p_cell 是一个指向指针数组的二维指针,该指针数组的每个元素都指向一个 cell 对象。可以通过坐标 i, j 获取对应的元素:

cell *p = (*p_cell)[i][j];

p_cell 定义为数组指针可能更容易:

cell *(*p_cell)[][width] = malloc(height * sizeof(*p_cell));

您可以在坐标ij处获取该物品。
cell *p = p_cell[i][j];

上述数组未初始化,您需要使用指向现有cell对象的指针或分配的cell对象的指针对其进行初始化。
如果二维数组仅在函数内部使用且宽度和高度不太大,则可以使用本地存储定义二维数组:
 cell *p_cell[height][width];

由于widthheight是动态值,因此无法进行静态初始化。您必须使用嵌套循环(如分配的数组)来初始化此数组。
问题是:您真的需要元素类型为指向cell的指针吗?只有在将其中一些指针指向同一个对象或具有空值或指向其他地方引用的cell对象时才有用。否则,最好使用cell对象的数组,可以是函数内部的局部数组或使用malloc()calloc()分配的数组:
cell p_cell[][width] = calloc(sizeof(*p_cell), height);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接