我已经创建了一小段代码来在 C 中动态分配一个二维数组,这被用来尝试解决我在一段较大的代码中遇到的问题,如果我可以动态分配一个2D array 我相信我会解决我的其他问题。我遇到的问题是,在分配矩阵并使用我的程序无法运行的函数写入矩阵后,我没有收到任何错误,它只是创建一个空白屏幕并最终崩溃。我不确定从这里可以取得怎样的进展,如有任何帮助,我们将不胜感激!
代码如下:
#include <stdlib.h>
void get_matrix(double **a, int n);
int main() {
int n = 5;
int i, j;
double **a;
a = (double **)malloc(n * sizeof(double *));
for (j = 0; j < n; j++)
a[j] = (double *)malloc(n * sizeof(double));
get_matrix(a, n);
for (i = 0; i <= n; i++) {
for (j = 0; j <= n; j++) {
printf("%d, ", a[i][j]);
}
printf("\n, ");
}
return 0;
}
void get_matrix(double **a, int n) {
int i, j;
for (i = 0; i <= n; i++) {
for (j = 0; j <= n; j++) {
a[i][j] = 4;
}
}
}
最佳答案
您的代码中存在多个问题:
- 您不包括
<stdio.h>
- 你的循环索引
i
和j
跑得太远了一步:因为索引在 C 中是基于零的,所以你必须在n
之前停止或者您将尝试访问数组外的元素。此错误会导致未定义的行为,这是对您观察到的情况的合理解释。 - 你传递了一个
double
对于%d
printf
转换规范。使用%g
相反。 - 在行首打印额外的逗号。
- 你的数组并不是真正的二维数组,它是一个间接数组。在 C99 中,您可以分配和使用具有参数大小的动态数组,称为 VLA。看下面的语法:
这是一个改进的版本:
#include <stdio.h>
#include <stdlib.h>
static void get_matrix(int n, double a[n][n]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = 4;
}
}
}
int main(void) {
int n = 5;
double (*a)[n] = malloc(sizeof(*a) * n);
get_matrix(n, a);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%g, ", a[i][j]);
}
printf("\n");
}
return 0;
}
关于c - 动态分配的二维数组出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44240301/