c - 动态分配的二维数组出错

标签 c matrix dynamic-arrays

我已经创建了一小段代码来在 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>
  • 你的循环索引ij跑得太远了一步:因为索引在 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/

相关文章:

delphi - 如何确定动态数组的引用数量?

c - 带有 C 的丰富 ctags 未正确产生到函数定义的重定向

c - Vala:使用 to_utf32_fast 方法发出警告和段错误

python - 什么是 { :4} mean in this matrix printing solution in python?

Python:遗传算法性能不佳

arrays - 生成一个矩阵,其中包含从 n 个向量中获取的元素的所有组合

c - C 中的指针,使用数组获得意外结果

delphi - 访问 _CopyArray 过程

c - 为什么我的 File.dat 不会被读取和运行,我如何将数据分配给结构? - C

c - ISO 9899 标准是否保留了将 _t 后缀用于标识符的任何用途?