如何在C中动态定义矩阵

时间:2014-03-08 13:00:14

标签: c matrix allocation

我创建了一个从外部txt文件打印2维矩阵的程序。如果我定义静态矩阵,例如A [10] [10],我的程序就可以工作。但我想动态分配内存。

当我尝试这段代码时:

int **A = (int **)malloc(N * N * sizeof(int));

出现以下错误:

  

dataStructures4.exe中0x00AC159B处的未处理异常:   0xC0000005:访问冲突写入位置0xCDCDCDCD。

在这个循环中:

for(i=0; i<N; i++){
    for(j=0; j<N; j++){
        A[i][j] = -1;
    }
}

我想我无法正确生成动态矩阵。我该如何修改我的代码?

6 个答案:

答案 0 :(得分:6)

您动态创建2d数组作为指向int*指针块的指针,这些指针指向int个块。

所以有两个步骤:

1)A指向int*

的第一块
int **A = (int **)malloc(N * sizeof(int*));

2)每个人都指向int s

的第一块
for(i=0; i<N; i++){
    A[i] = (int *)malloc(N * sizeof(int));
}

答案 1 :(得分:3)

使用指向特定大小的数组的指针:

您可以使用#define定义N,或使用变量:

int n = 10 ;
int (*A)[n] = malloc(n * n * sizeof(int));

这样你就会得到一块连续的内存。

答案 2 :(得分:1)

请注意A[i][j]*(*(A+i)+j)相同。您的代码已损坏,因为*(A+i)取消引用了无效的未初始化指针。这发生在这一行:

A[i][j] = -1;

另一种方法是使用动态分配的指针数组,其中每个元素指向另一个动态分配的数组。你可以这样做:

int **array = malloc(N*sizeof(*array));
for (int i = 0; i < N; i++)
    array[i] = malloc(N*sizeof(*array[i]));

/* Use array[i][j]... */

请注意,内存布局与2D数组的内存布局非常不同,但表达式array[i][j]将执行您想要的操作 - 它将“看起来”就像您拥有2D数组一样。

答案 3 :(得分:1)

分别分配每一行,如下所示:

int **A = (int **)malloc(N * sizeof(int*));

for(i=0; i<N; i++){
    A[i] = (int *)malloc(N * sizeof(int));
}

答案 4 :(得分:1)

与数组相同,2维矩阵包含连续的地址空间。所以理论上有一种方法可以达到这个目的。

int m = 2;
int n = 4;
int *a = malloc(m*n*sizeof(int));
int **b = malloc(m*sizeof(int*));
for(int i=0, i<m, i++)
{
    b[i] = a+i*n;
}

通过这种方式,b可以根据需要用作矩阵。但是,它会浪费malloc(m * sizeof(int *))来保存b。

或者你可以:

int m = 2;
int n = 4;
int *a = malloc(m*n*sizeof(int));

使用[m * i + j]作为[i] [j]

答案 5 :(得分:0)

希望以下内容很好。我没有测试它,只是为您提供语法。

int** abc; // Your 2D array pointer abc[N][M]

abc = (int**)malloc(dim1_max * sizeof(int*)); // dim1_max is N
for (int i = 0; i < dim1_max; i++) {
  abc[i] = (int*)malloc(dim2_max * sizeof(int)); // dim2_max is M
}

[....your array used....]
//Once you allocate dynamically you need to free the memory. IMP point.
for (int i = 0; i < dim1_max; i++) {
  free(abc[i]);
}
free(abc);