4

我的教授发送测试代码在我们的程序上运行。但是,测试代码本身在编译时存在分段错误错误。错误发生在第一个 printf 上。但是,如果该行被注释掉,它只会出现在下一行。听起来代码对他来说很好,所以我试图弄清楚为什么它对我来说失败了。我知道他在使用 C++ 时使用 C,但即使我尝试使用 gcc 而不是 g++ 编译测试代码,它仍然失败。任何人都知道为什么我可能会遇到问题?谢谢!代码如下。

#include <stdio.h>

main()
{  double A[400000][4],  b[400000], c[4] ;
   double result[4];
   int i, j; double s, t;
   printf("Preparing test: 4 variables, 400000 inequalities\n");
   A[0][0] = 1.0; A[0][1] = 2.0; A[0][2] = 1.0; A[0][3] = 0.0; b[0] = 10000.0;
   A[1][0] = 0.0; A[1][1] = 1.0; A[1][2] = 2.0; A[1][3] = 1.0; b[0] = 10000.0;
   A[2][0] = 1.0; A[2][1] = 0.0; A[2][2] = 1.0; A[2][3] = 3.0; b[0] = 10000.0;
   A[3][0] = 4.0; A[3][1] = 0.0; A[3][2] = 1.0; A[3][3] = 1.0; b[0] = 10000.0;
   c[0]=1.0; c[1]=1.0; c[2]=1.0; c[3]=1.0;
   for( i=4; i< 100000; i++ )
   {  A[i][0] = (12123*i)%104729; 
      A[i][1] = (47*i)%104729; 
      A[i][2] = (2011*i)%104729; 
      A[i][3] = (7919*i)%104729;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1 + (i%137);
   }
   A[100000][0] = 0.0; A[100000][1] = 6.0; A[100000][2] = 1.0; 
   A[100000][3] = 1.0; b[100000] = 19.0;
   for( i=100001; i< 200000; i++ )
   {  A[i][0] = (2323*i)%101111; 
      A[i][1] = (74*i)%101111; 
      A[i][2] = (2017*i)%101111; 
      A[i][3] = (7915*i)%101111;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%89);
   }
   A[200000][0] = 5.0; A[200000][1] = 2.0; A[200000][2] = 0.0; 
   A[200000][3] = 1.0; b[200000] = 11.0;
   for( i=200001; i< 300000; i++ )
   {  A[i][0] = (23123*i)%100003; 
      A[i][1] = (47*i)%100003; 
      A[i][2] = (2011*i)%100003; 
      A[i][3] = (7919*i)%100003;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 2 + (i%57);
   }
   A[300000][0] = 1.0; A[300000][1] = 2.0; A[300000][2] = 1.0; 
   A[300000][3] = 3.0; b[300000] = 20.0;
   A[300001][0] = 1.0; A[300001][1] = 0.0; A[300001][2] = 5.0; 
   A[300001][3] = 4.0; b[300001] = 32.0;
   A[300002][0] = 7.0; A[300002][1] = 1.0; A[300002][2] = 1.0; 
   A[300002][3] = 7.0; b[300002] = 40.0;
   for( i=300003; i< 400000; i++ )
   {  A[i][0] = (13*i)%103087; 
      A[i][1] = (99*i)%103087; 
      A[i][2] = (2012*i)%103087; 
      A[i][3] = (666*i)%103087;
      b[i] = A[i][0] + 2*A[i][1] + 3*A[i][2] + 4* A[i][3] + 1;
   }

   printf("Running test: 400000 inequalities, 4 variables\n");
   //j = rand_lp(40, &(A[0][0]), &(b[0]), &(c[0]), &(result[0]));
   printf("Test: extremal point (%f, %f, %f, %f) after %d recomputation steps\n", 
          result[0], result[1], result[2], result[3], j);
   printf("Answer should be (1,2,3,4)\n End Test\n");
}
4

2 回答 2

18

尝试改变:

double A[400000][4],  b[400000], c[4] ;

static double A[400000][4],  b[400000], c[4] ;

您对A数组的声明具有自动存储持续时间,这可能意味着在您的系统上它存储在堆栈中。您的进程的总堆栈可能低于此值,并且您遇到了堆栈溢出。

在 Linux 上,您可以运行以下ulimit命令:

$ ulimit -s
8192
$

查看分配给进程的堆栈大小(以 kB 为单位)。例如,我的机器上有 8192 kB。

于 2012-05-07T21:07:09.063 回答
12

您已经溢出了堆栈的限制。您的教授在main的堆栈帧中声明了 15MB 的数据。那太大了。

由于在 main 顶部声明的 ojbect 的生命周期本质上是整个程序,因此只需将对象声明为static. 这样,它们将位于(相对无限的)数据段中,并且具有几乎相同的生命周期。

尝试更改此行:

double A[400000][4],  b[400000], c[4] ;

对此:

static double A[400000][4],  b[400000], c[4] ;
于 2012-05-07T21:07:01.340 回答