Dorjay Yolmo
Dorjay Yolmo

Reputation: 33

Call by value in C

I'm new to programming and I am currently working on C.

I learned that C does not have call by reference. The programs that we write to pass the address of actual parameters to the formal parameters is also call by Value in C.

Correct me if I'm wrong.. However, I ran this program :

//Swapping of two numbers using functions. #include

void swap(int *,int *);

void main()
{
    int x,y;
    printf ("Enter the values of x and y : ");
    scanf("%d %d",&x,&y);

    swap(x,y);

    printf("The value of x = %d and y = %d",x,y);
}

void swap(int *a,int *b)
{
    int temp;

    temp=*b;
    *b=*a;
    *a=temp;
}

It compiles just fine.. however, I'm getting a Segmentation Fault in the Output.

It asks me the enter the value of X and Y and then gives, Segmentation fault..

Please help!!

Upvotes: 3

Views: 1115

Answers (4)

sqr163
sqr163

Reputation: 1184

To avoid similar segfaults at runtime, always compile with -Wall.

Actually, there is a way to pass-by-reference in C, just change two lines in your code like this:

#define swap(x,y)  swap_impl__(&(x), &(y))

static void swap_impl__(int *a, int *b)
{
    int temp;
    temp=*b;
    *b=*a;
    *a=temp;
}

void main()
{
    int x,y;
    printf ("Enter the values of x and y : ");
    scanf("%d %d",&x,&y);

    swap(x,y);

    printf("The value of x = %d and y = %d",x,y);
}

Upvotes: 1

Ashish Patel
Ashish Patel

Reputation: 101

the call by value method of passing arguments to a function copies the actual value of an argument into the formal parameter of the function. In this case, changes made to the parameter inside the function have no effect on the argument. but here you are passing values

swap(x,y)

but taking it as address

void swap(int *a,int *b)

so it is looking for an address which passed by your variable. for example, if you have passed something like

swap(x,y)

and if we have x=100 and y=200, then it is assuming 100 and 200 to be addresses and trying to access it will definitely give you error as they may not exist or having garbage value.

Upvotes: 0

CIsForCookies
CIsForCookies

Reputation: 12837

you are sending an int to a function that expects int*, thus when you are dereferencing - temp=*b; you are trying to access memory you don't own -> segfault. Call swap like this: swap(&x,&y);

Upvotes: 7

LoztInSpace
LoztInSpace

Reputation: 5697

So close

swap(&x,&y);

You were not passing references (pointers)

Upvotes: 5

Related Questions