我遇到了一个旧代码,我需要在其中为矩阵数组分配内存。当前,它是通过创建结构矩阵并通过构造结构分配内存来完成的。
就这样。
struct matrix
{
int x[13][13];
};
int main()
{
matrix *push = (matrix*)malloc(sizeof(matrix) * 1000);
//do stuff
free(push);
return 0;
}
但是现在是问题。我真的需要这样做吗?我知道我可以声明int *matrix[13][13];
但是我似乎无法找出一种为该变量分配内存的方法。
我尝试了matrix = (int***)malloc(sizeof(int[13][13])*1000);
,结果是
E0137 expression must be a modifiable lvalue
,老实说也不正确
我知道有很多更好和创新的方式来分配这样的数组,但我很好奇
问题
int *matrix[13][13]
这种变量甚至意味着什么或代表什么?是指向2D矩阵的指针还是指向2D矩阵的数组的指针? 说明
从评论看来,int *matrix[13][13]
代表13x13 int *的矩阵
我要问的是,实际上有没有一种方法可以使用具有动态分配的第一维以及静态的第二维和第三维的变量,而无需使用typedef等结构
编辑
正如felix所指出的
我正在寻找的是int (*matrix)[13][13] = (int(*)[13][13])malloc(1000*sizeof(matrix));
答案 0 :(得分:2)
不,您不想使用
int *matrix[13][13];
这将声明[13][13]
个int*
数组。
您需要
// pointer to "an array of 13 x 13 ints"
int (*matrix)[13][13];
或通过使用类型别名对其进行简化。
typedef int matrix_type[13][13];
matrix_type* matrix_ptr;
您可以使用以下方法为此类变量分配内存
matrix_type* matrix_ptr = malloc(1000*sizeof(*matrix_ptr));
并使用
为其分配值matrix_ptr[0][0][0] = 0;
...
matrix_ptr[999][12][12] = 0;
答案 1 :(得分:2)
我注意到,有时初学者会发现类型定义多维矩阵的类型,这些多维矩阵必须动态分配,因为它将问题简化为单个星形指针,并且定义的类型和指向它的指针的大小更容易实现了解。
#include <stdio.h>
typedef int my13x13matrix[13][13];
int main(void) {
my13x13matrix *mylargematrix = malloc(1000 * sizeof(*mylargematrix));
mylargematrix[999][12][12] = 5;
printf("%d \n", mylargematrix[999][12][12]);
return 0;
}
您还可以使用单星指针算法。
my13x13matrix *anotherpointer = &mylargematrix[10];
(*anotherpointer)[5][5] = 1;
anotherpointer++;
(*anotherpointer)[5][5] = 2;
printf("%d %d\n", mylargematrix[10][5][5], mylargematrix[11][5][5]);