Search code examples
cif-statementsegmentation-faultargc

why this segmentation fault (core dumped) ??? int main (int argc, char *argv[])


int main (int argc, char *argv[])
{
    int a, b, quo, rest;

    void division(int dividendo, int divisor, int *ptr_quociente, int *ptr_resto)
    {
        *ptr_quociente=dividendo/divisor;
        *ptr_resto=dividendo%divisor;
    }

    if(argc=3)
    {
        a= atoi(argv[1]);   
        b= atoi(argv[2]);    

        division(a,b,&quo,&rest);

        printf(" %d and %d \n",quo,rest);
    }
    else if (argc=1)
        do
        {
            printf("type two int numbers:\n");

            scanf("%d %d", &a, &b);

            division(a,b,&quo,&rest);

            printf(" %d and %d \n",quo,rest);

        } while(a!=0);
}

if I do:

./program.c 12 6

it works but if I do:

./program.c

I get a segmentation fault, why?


Solution

  •  if(argc=3) should be if(3 == arc) //notice '=='
    

    That's why it is always good idea to keep constant on LHS, this will avoid accidental assignment

    Same with arc=1

    Also, I moved local function definition outside main.

    void division(int dividendo, int divisor, int *ptr_quociente, int *ptr_resto)
    
    {
    
           *ptr_quociente=dividendo/divisor;
           *ptr_resto=dividendo%divisor;
    }
    
    int main (int argc, char *argv[])
    
    {
    ...
    }
    

    Edit: After reading comments from Paxdiablo and Shafik, I came to know most modern compiler would warn for '=' in condition. You can simply write if(argc == 3) rather than placing constant on LHS.