Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing the pointer inside a function does not reflect outside the function [duplicate]

Tags:

c

pointers

void alloco(int *ppa)
{
    int i;
    printf("inside alloco %d\n",ppa);
    ppa = (int *)malloc(20);
    ppa[15] = 9;
    printf("size of a %d \n", sizeof(ppa));
    for(i=0;i<20;i++)
    printf("a[%d] = %d \n", i, ppa[i]);
}

int main()
{
    int *app = NULL;
    int i;
    printf("inside main\n");
    alloco(app);
    for(i=0;i<20;i++)
    printf("app[%d] = %d \n", i, app[i]);
    return(0);
}

Basically all I wanted to do is to pass a null pointer from my main to a function(alloco) which allocates memory/fills the same location the pointer is pointing to and returns. I am getting local prints correctly that is inside function(alloco) but not in main.

Am I doing anything wrong here?

like image 206
pa1 Avatar asked Dec 05 '22 03:12

pa1


2 Answers

C uses pass by value for function parameter passing. You can change the value at address pointed by app [i.e., ppa, in alloco()] from alloco() but cannot change the value of app. In other words, ppa is local to function alloco(). Changing the value of ppa won't be affecting (reflected to) app present in main().

If you want to change the value of app itself from alloco(), you need to pass a pointer to app (Pointer-to-Pointer).

Apart from this issue, in your code

ppa = (int *)malloc(20);  

is wrong. What you wanted is actually

ppa = malloc(20 * sizeof (int)); //argument is in bytes, not in `int` or any elements

or, better,

ppa = malloc(20 * sizeof * ppa);  //data type integrity

Also, it's worthy to mention that please do not cast the return value of malloc() and family in C.

One more thing, while printing a pointer, use %p format specifier, while printing size_t, use %zu, like

printf("inside alloco %p\n",ppa);

and

printf("size of a %zu\n", sizeof(ppa));  //sizeof returns size_t
like image 140
Sourav Ghosh Avatar answered May 25 '23 16:05

Sourav Ghosh


You need this:

void alloco(int **ppa)
{
    int i;
    printf("inside alloco %p\n",ppa);
    *ppa = malloc(20 * sizeof(int));
    (*ppa)[15] = 9;     // rather pointless, in the loop below (*ppa)[15] will be
                        // overwritten anyway
    printf("size of a %d \n", sizeof(*ppa));  // rather pointless, not sure
                                              // what you want to print here

    for(i = 0; i < 20; i++)
      printf("a[%d] = %d \n", i, (*ppa)[i]);
}

int main()
{
    int *app = NULL;  // you can drop the '= NULL', it's useless, because
    int i;            // alloco(&app) will change the value of app anyway
    printf("inside main\n");
    alloco(&app);

    for(i = 0; i < 20; i++)
      printf("app[%d] = %d \n", i, app[i]);

    return 0;
}

In your program you pass a pointer to alloco which will be in the ppa parameter. This ppa parameter is just like a local variable inside of alloco and when you modify it, the original value you passed to the function in main(app) won't be modified.

In the corrected version, we pass a pointer to app. In alloco we dereference that pointer and write the malloced value to it.

like image 41
Jabberwocky Avatar answered May 25 '23 16:05

Jabberwocky