Utsav Chatterjee
Utsav Chatterjee

Reputation: 49

Why am I getting this error during run-time?

I wrote this program while watching a tutorial to compare the difference between 'call-by-value' and 'call-by-reference' in C. But i am getting the error:

Run Command: line 1: 1508 Segmentation fault: 11 ./"$2" "${@:3}"

Help?

main() 
{
int a,b;
scanf("%d %d", &a, &b);
printf("Before Call %d %d", a,b);
exch_1(a,b);
printf("After first call %d %d", a,b);
exch_2(a,b);
printf("After second Call %d %d \n", a,b);  

}

exch_1(i,j)
int i, j;
{
    int temp;
    temp = i;
    i = j;
    j = temp;
}

exch_2(i,j)
int *i, *j;
{
    int temp;
    temp = *i;
    *i = *j;
    *j = temp;
}

Upvotes: 0

Views: 714

Answers (2)

stev
stev

Reputation: 182

Here is the correct code for your problem . Compile your original code with gcc -Wall . It will give you lot of warnings for your above code and preferably you need to fix all of them. If you do not know linux and gcc please learn it. Do not use old tools like turboC compiler etc

void exch_1(int i, int j);   // declare function prototype for exch_1 --> call by value
void exch_2(int* i, int* j);  // declare function prototype for exch_1 --> call by reference

int main()
{
    int a,b;

    scanf("%d %d", &a, &b);
    printf("Before Call %d %d\n", a,b);

    exch_1(a,b);  // call by value. changes done in exch_1 are not reflected here
    printf("After first call %d %d\n", a,b);

    exch_2(&a, &b);   // --> please see the change here for call by reference, you 
                      //should  pass address as the parameters
                      // changes done in exch_2 can be seen here since we pass address
                      // In you original program you are passing value of a and b as the 
                      // address.When you try to access those values in exch_2 the it leads
                      // to undefined behavior and so you can get segfault as well.
    printf("After second Call %d %d \n", a,b);

    return 0;    
}

void exch_1(int i,int j)
//int i, j;    // you do not need these variables
{
    int temp;
    temp = i;
    i = j;
    j = temp;
}

void exch_2(int* i,int* j)
//int *i, *j;   // this line not needed
{
    int temp;
    temp = *i;
    *i = *j;
    *j = temp;
}

Upvotes: 0

FrankPl
FrankPl

Reputation: 13315

As exch_2 expects addresses as parameters, you would have to call it exch_2(&a,&b);.

You are passing the values, and these are taken as addresses. If e. g. a has a value of 5, the computer would try to use the value at address 5on your computer - which probably is not accessible to your program.

Upvotes: 5

Related Questions