How to find a problem in a C program : Program received signal SIGSEGV, Segmentation fault
c, gcc, gdb
Solution
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.
Problem
I have a problem with a C program. It was working before I made some changes (from define do var declarations). Now: - it compiles without errors using: `gcc m.c -lm -Wall -march=native` - has a run-time error: Segmentation fault 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; } ```