arrays - C 指向 int(*)[row] 类型的动态数组的指针,其中 row 在结构内部未分配

标签 arrays c multidimensional-array struct types

基本上,我想要一个可以放置数据和数组的结构。

我知道使用 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/

相关文章:

ruby-on-rails - Rails 4 - 验证数组中的元素

c - 如何获取字符串大小

python - Python Numpy 数组中的 double 元素

java - 迷宫求解器 ArrayIndexOutOfBoundsException

c - 在结构中分配内存时类型不兼容

c++ - 如何将结构放入 union 中

c - 为什么 Kernighan 和 Ritchie 包含看似不必要的类型转换?

Java多维数组到C#

android - 根据字符串数组大小创建复选框

c - 在循环内声明时数组基地址正在更改