Adam
Adam

Reputation: 1386

How to find a problem in a C program : Program received signal SIGSEGV, Segmentation fault

I have a problem with a C program. It was working before I made some changes (from define do var declarations). Now:

So I tried to find a problem using gdb. Now I know more:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400bbb in GivePeriod (Cx=-0,75, Cy=-0, Iteration_Max=650000, 
    precision=0,00033329999999999997) at m.c:137
137    orbit[0][0]=0.0;

The problem is in function (which code was not changed), code below.

How can I find the problem?

gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)

/*-------------------------------*/
// this function is based on program:
// Program MANCHAOS.BAS  
// http://sprott.physics.wisc.edu/chaos/manchaos.bas
// (c) 1997 by J. C. Sprott 
//
int GivePeriod(double Cx,double Cy, int Iteration_Max, double precision)
{  
 double Zx2, Zy2, /* Zx2=Zx*Zx;  Zy2=Zy*Zy  */
     ZPrevieousX,ZPrevieousY,
     ZNextX,ZNextY;
   int Iteration,
  I;  
double orbit[Iteration_Max+1][2]; /* array elements are numbered from 0 to   length-1 */    
 /* starting point is critical point  */
ZPrevieousX=0.0;
ZPrevieousY=0.0;
orbit[0][0]=0.0;
orbit[0][1]=0.0;  
Zx2=ZPrevieousX*ZPrevieousX;
Zy2=ZPrevieousY*ZPrevieousY;
/* iterate and save points for analysis */
for (Iteration=1;Iteration<Iteration_Max+1 ;Iteration++)
    {
        ZNextY=2*ZPrevieousX*ZPrevieousY + Cy;
        ZNextX=Zx2-Zy2 +Cx;
        Zx2=ZNextX*ZNextX;
        Zy2=ZNextY*ZNextY;
        if ((Zx2+Zy2)>ER2) return 0; /* basin of atraction to infinity */
        //if   (SameComplexValue(ZPrevieousX,ZPrevieousY,ZNextX,ZNextY,precision))
        //   return 1; /* fixed point , period =1 */
        ZPrevieousX=ZNextX;
        ZPrevieousY=ZNextY;
        /* */
        orbit[Iteration][0]=ZNextX;
        orbit[Iteration][1]=ZNextY;   

    }; 
 /* here iteration=IterationMax+1 but last element of orbit has number  IterationMax */    
 for(I=Iteration_Max-1;I>0;I--) 
  if (SameComplexValue(orbit[Iteration_Max][0],orbit[Iteration_Max] [1],orbit[I][0],orbit[I][1],precision))
    return(Iteration_Max-I);
 return 0;
}

Upvotes: 3

Views: 1139

Answers (2)

wholerabbit
wholerabbit

Reputation: 11546

Program received signal SIGSEGV, Segmentation fault. 0x0000000000400bbb in GivePeriod (Cx=-0,75, Cy=-0, Iteration_Max=650000, precision=0,00033329999999999997) at m.c:137 137 orbit[0][0]=0.0;

double orbit[Iteration_Max+1][2];

650001 * 2 * 8 (bytes/double) = 10400016

That's probably bigger than your maximum stack size;1 on linux you can check that with ulimit -s and by default it is 8192 kB.

If you need storage that big, allocate it on the heap with malloc() and free() it when done.


1. Memory in a C program is broken into two main areas: the heap, which contains globals and dynamically allocated things (and grows with them), and the small fixed size stack, which is a LIFO structure onto which local data is pushed. Since array orbit is declared in a function and not allocated dynamically, it is local data and pushed onto the stack. When a function exits, its local data is popped off the stack and discarded.

Upvotes: 7

Mat
Mat

Reputation: 206727

You're probably blowing your stack. That orbit array weighs something like 10 megabytes, too much for a stack allocation.

Allocate it on the heap with malloc or calloc, and don't forget to free it on every path that exits your function.

Upvotes: 4

Related Questions