将内存分配给int * a [13] [13]类型的变量

时间:2018-07-26 19:39:46

标签: c arrays pointers

我遇到了一个旧代码,我需要在其中为矩阵数组分配内存。当前,它是通过创建结构矩阵并通过构造结构分配内存来完成的。

就这样。

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,老实说也不正确

我知道有很多更好和创新的方式来分配这样的数组,但我很好奇

问题

  1. int *matrix[13][13]这种变量甚至意味着什么或代表什么?是指向2D矩阵的指针还是指向2D矩阵的数组的指针?
  2. 如何使用上述变量?
  3. 如何在不使用更多变量的情况下为上述变量分配内存?

说明 从评论看来,int *matrix[13][13]代表13x13 int *的矩阵

我要问的是,实际上有没有一种方法可以使用具有动态分配的第一维以及静态的第二维和第三维的变量,而无需使用typedef等结构

编辑 正如felix所指出的 我正在寻找的是int (*matrix)[13][13] = (int(*)[13][13])malloc(1000*sizeof(matrix));

2 个答案:

答案 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]);