为什么程序不能用于数组,但当它是普通变量时却可以正常工作?

时间:2019-05-14 08:06:51

标签: c arrays double codeblocks

我正在尝试编写一个代码,该代码需要几个输入,调用该函数来计算一个值,将该值分配给一个变量并打印该变量。实际上,我需要根据这些值形成一个矩阵。

当我将值分配给常规变量时,程序将执行预期的操作。因此,如果主要功能是这样的:

//some user-defined functions that the main function calls//

void main()
{
    int m,n;
    printf("Row: ");
    scanf("%d",&m);
    printf("Column: ");
    scanf("%d",&n);
    double k,A;
    printf("k= ");
    scanf("%lf",&k);
    A=matrix_element(m,n,k);
    printf("%lf",A);
}

输出正确:

Row: 1
Column: 1
k= 1
2.275499
Process returned 8 (0x8)   execution time : 5.974 s
Press any key to continue.

但是当我尝试将值分配给数组中的元素时,该程序将无法正常工作。我的意思是说,如果主要功能是这样的:

//some user-defined functions that the main function calls//

void main()
{
    int m,n;
    printf("Row: ");
    scanf("%d",&m);
    printf("Column: ");
    scanf("%d",&n);
    double k,A[800][800];
    printf("k= ");
    scanf("%lf",&k);
    A[m][n]=matrix_element(m,n,k);
    printf("%lf",A[m][n]);
}

程序不执行任何操作:

Process returned -1073741571 (0xC00000FD)   execution time : 2.207 s
Press any key to continue.

发生了什么事,我该如何解决?我必须将值放在800x800 2D数组中,因为我的最终目标是将其放在for循环中并形成这些尺寸的矩阵。

对于那些想查看MCVE代码的人,这里是:

#include <stdio.h>

double S(int g, int i) //Scattering Cross-section//
{
    double x;
    x=2;
    return x;
}

double D(int g, int i) //Diffusion co-efficient//
{
    double x;
    x=2;
    return x;
}

double A(int g, int i) //Absorption Cross-section//
{
    double x;
    x=2;
    return x;
}

double vF(int g, int i) //velocity x Fission Cross-section//
{
    double x;
    x=2;
    return x;
}

double F(int g, int i) //Fission Cross-section//
{
    double x;
    x=2;
    return x;
}

double h(int i) //Height//
{
    double x;
    x=2;
    return x;
}

double matrix_element(int m, int n, double k)
{
    int g,i;
    double C;
    C=1;
    return C;
}

void main()
{
    int m,n;
    printf("Row: ");
    scanf("%d",&m);
    printf("Column: ");
    scanf("%d",&n);
    double k,A[800][800];
    printf("k= ");
    scanf("%lf",&k);
    A[m][n]=matrix_element(m,n,k);
    printf("%lf",A[m][n]);
}

这产生了同样的问题。

4 个答案:

答案 0 :(得分:0)

一种快速解决方案是将数组置于全局范围内,而不是在函数内部声明它:

double A[800][800];

void main()
{
    int m, n;
    printf("Row: ");
    scanf("%d", &m);
    printf("Column: ");
    scanf("%d", &n);
    double k;
    printf("k= ");
    scanf("%lf", &k);
    A[m][n] = 123.0; // for this example you can replace "matrix_element" with a dummy value
    printf("%lf", A[m][n]);
}

这样,它位于单独的存储位置而不是堆栈中。 double通常为8个字节,因此A[800][800]大为4.88 MB。如果是全局的,除非您使用的是嵌入式系统,旧机器或内存非常有限的其他系统,否则这不是一个大问题。有关堆栈有多少内存的更多详细信息,请参见this question。但是,通常,编写良好的程序不应该与之接近。

答案 1 :(得分:0)

2D数组A的大小很可能导致堆栈溢出。应避免使用较大的局部变量(即具有自动存储期限的变量)。而是使用动态分配。

对于动态分配的2D数组,请执行以下操作:

#define ARR_SIZE 800

...

double (*A)[ARR_SIZE] = malloc(ARR_SIZE * sizeof *A);

...

A[m][n] = 42.0;

...

free(A);

答案 2 :(得分:0)

除了将矩阵定义为全局变量或使用malloc从堆中分配矩阵外,您可以为程序声明更大的堆栈。但是,这些步骤取决于OS /编译器。您将需要查阅编译器文档以获取详细信息。

每种方法(全局,堆和堆栈)都有其优势/劣势。即使它们都能解决问题,您也应该选择最佳的解决方案。

答案 3 :(得分:-1)

问题似乎是堆栈上分配的大小。该应用程序崩溃于

double k,A[800][800];

因为此数组是在程序开始时分配的,所以数组的大小为800 * 800 * 8 = 5MB。对于您的堆栈来说太大了。

代码编写为:

double* A = malloc(sizeof(double)*m*n);

这将在堆上分配内存并使它工作。