5

Please find the code snippet as shown below:

#include <stdio.h> 

int My_func(int **); 

int main() 
{ 
     int a =5;
     int *p = &a;
     My_Func(&p);
     printf("The val of *p is %d\n,*p);
}

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     *p = Ptr;
}

How does by using a double pointer as a argument in my_Func function and making change of value reflects the same in the main function but if we use a single pointer in My_Func does not change the value in main?Please do explain me with examples if possible

Advanced thanks
Maddy

Gilad Green
  • 36,708
  • 7
  • 61
  • 95
Maddy
  • 503
  • 4
  • 12
  • 21

4 Answers4

7

int **p is a pointer to a pointer-to-int. My_Func(int **p) works by changing the value of integer that the pointer-to-int points to i.e. int a.

Without changing the implementation, the function will not work with a pointer-to-int parameter int *p as there is a second level of indirection. In addition, you're setting the value to a local variable that is created on the stack. When the function is completed the memory used for the variable will be reclaimed, therefore making the value of a invalid.

void My_Func(int **p)
{
     int val = 100; // Local variable.
     int *Ptr = &val; // This isn't needed.
     *p = Ptr;
} // val dissapears.

Remove the second level of indirection and copy val by value instead of pointing to it:

#include <stdio.h>

void My_Func(int *p) 
{
    int val = 100;
    *p = val;
}

int main(void) 
{
    int a = 5;
    My_Func(&a);
    printf("The val of a is %d\n", a);
    return 0;
}
Garee
  • 1,274
  • 1
  • 11
  • 15
6

In short, in C when you pass something as a parameter, a copy will be passed to the function. Changing the copy doesn't affect the original value.

However, if the value is a pointer, what it points to can be changed. In this case, if you want to affect the pointer, you need to pass a pointer to it down to the function.

Joachim Isaksson
  • 176,943
  • 25
  • 281
  • 294
0

You are assigning the address of local variable, which will soon disappear when My_Func returns. You can use following in your code. However you can do the same thing just by using single pointer, double pointer is not required in this example.

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     **p = *Ptr;
}
Gilad Green
  • 36,708
  • 7
  • 61
  • 95
praks411
  • 1,972
  • 16
  • 23
  • I am late here, hope you don't mind I ask: I have the exact problem, I tried passing both single and double pointers and change the value within a function, in both cases, the original values did get changed. My understanding is that we need to use a double pointer to change the original value within a function. Hope you could shred some light on this. Thanks in advance. – Unheilig Apr 04 '14 at 12:31
0

Use it in the function declaration:

void func(int *p)
{
  int val =100;
  int *temp=&val;
  p=temp;
 }

p starts pointing to another address i.e. address of val. So it will print the value 100.

Important note: Try it in your downloaded compiler (always in case of pointers) not in the online compiler. The online compiler doesn´t keep track of lost addresses in stack.

petezurich
  • 9,280
  • 9
  • 43
  • 57