Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pointers to string in functions

it seems i'm stuck with some basics. Can someone explain me why next code:

#include <stdlib.h>

void Test1(char *t)
{
    t = (char *)malloc(11);
    strcpy(t, "1234567890");
}

void Test2(char **t)
{
    *t = (char *)malloc(11);
    strcpy(*t, "1234567890");
}

void Test3(char *t)
{
    strcpy(t, "1234567890");
}

char * Test4(char *t)
{
    t = (char *)malloc(11);
    strcpy(t, "1234567890");
    return t;
}

int main()
{
    char *t1 = NULL;
    Test1(t1);
    printf("\nTest1: %s\n", t1);

    char *t2 = NULL;
    Test2(&t2);
    printf("\nTest2: %s\n", t2);

    char *t3 = (char *)malloc(11);
    Test3(t3);
    printf("\nTest3: %s\n", t3);

    char *t4 = NULL;
    t4 = Test4(t4);
    printf("\nTest4: %s\n", t4);

    return 0;
}

gives this output:

Test1: (null)

Test2: 1234567890

Test3: 1234567890

Test4: 1234567890

What's wrong with Test1 function? And why Test4, which almost similar to Test1, works? More general question: what's the correct way to create string in function and return pointer to it?

like image 682
clumpter Avatar asked Jan 07 '11 14:01

clumpter


2 Answers

The function parameters aren't working the way you think. You're passing in the value by "value" rather than by "reference" which means once inside the function, any changes to those values are local only to that function, so when the function exits the local changes are thrown away.

To fix this, either pass in a pointer to the pointer (char** t), or pass the pointer by reference (char&*) and change the function code to match.

like image 113
Roger Perkins Avatar answered Oct 03 '22 14:10

Roger Perkins


you have defined t1 as char* t1 = NULL; and calling the function as Test1(t1); passing the pointer variable t1 (not its address).

The function Test1 is expecting a char* void Test1(char *t)

here t is a variable local to Test1 function only. Any modification that you do inside the function will not be visible out side the function because you are actually not modifying the main function's variable t1 but the local variable t.

like image 45
Vikram.exe Avatar answered Oct 03 '22 14:10

Vikram.exe