动态分配的2D阵列出错

时间:2017-05-29 10:31:31

标签: c matrix dynamic-arrays

我已经创建了一小段代码来动态地在C中分配一个2D数组,这用于尝试解决我在更大的代码上遇到的问题,如果我可以动态分配一个2D阵列我相信我会解决我的另一个问题。我遇到的问题是,在我分配了矩阵并用函数写入它后,我的程序没有运行,我没有得到任何错误,它只是创建一个空白屏幕并最终崩溃。我不确定从哪里开始,任何帮助都会非常感激!

以下是代码:

#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;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

问题在于for循环。您的for循环现在运行n + 1次,而不是n次。这意味着您正试图在未分配的内存区域上写一些内容。

for (i=0; i<=n; i++)

应该是:

for (i=0; i<n; i++)

你必须使用条件而不是小于或等于

虽然我可以看到你的代码,但我还是会建议一些技巧,以便通过直接在sizeof中使用变量来避免以后的问题:

a = (double **) malloc (n * sizeof(*a));

这将自动检测分配大小所需的sizeof *a

答案 1 :(得分:2)

您的代码中存在多个问题:

  • 您不包含<stdio.h>
  • 您的循环索引ij运行一步太远:因为基于C的索引为零,您必须在n之前停止,否则您将尝试访问数组外的元素。此错误会导致未定义的行为,这是您观察到的合理解释。
  • 您为double %d转换规范传递printf。请改用%g
  • 您在行的开头打印额外的逗号。
  • 您的数组实际上不是2D数组,而是间接数组。在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;
}

答案 2 :(得分:1)

您的索引基于零。这意味着你用&lt;来检查for循环的结束条件。而不是&lt; =。 0..n-1是您分配的n个位置。

#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;
        }
    }
}

答案 3 :(得分:0)

自上周你上次帮助我以来,我一直无法解决这个问题!我对它的编写方式进行了一些修改并运行良好,唯一的问题是当我打印矩阵时它只打印零?

我已将修改后的代码包含在内。

#include <stdio.h>
#include <stdlib.h>

void get_matrix (double **a, int n);
void print_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(*a));

    get_matrix (a, n);
    print_matrix (a, 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;
        }
    }
}

void print_matrix (double **a, int n)
{
    int i, j;

    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        {
            printf("%d, ", a[i][j]);
        }
        printf("\n ");
    }
}