我正在尝试编写一个代码,该代码需要几个输入,调用该函数来计算一个值,将该值分配给一个变量并打印该变量。实际上,我需要根据这些值形成一个矩阵。
当我将值分配给常规变量时,程序将执行预期的操作。因此,如果主要功能是这样的:
//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]);
}
这产生了同样的问题。
答案 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);
这将在堆上分配内存并使它工作。