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

问题描述 投票:0回答:1

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

我知道使用 int** 然后 malloc 一个指针数组的方法。 然后在每个指针处分配内存。

但这不是我想要的。原因是从技术上讲,这会更慢,因为(缓存的东西)。

此外,它还允许数据不碎片化。

如果我让它运行起来,我将有明确的最佳方法来创建一个可以放置在结构中的动态二维数组。

这里是即将完成的代码示例。

我知道这与已经提出的问题相似,甚至与我早先提出的问题相似,但我要的是不同的答案。

(在堆(动态内存,malloc ...)上创建任意大小(行,列)的二维数组的最佳方法是什么,这样该数组是可以包含在结构中的数据类型。如果数据可以相应地存储在内存中,则加分。)

#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;
}
arrays c multidimensional-array struct types
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.