Saturday, 6 May 2017

c - Pointers to string in functions




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




#include

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?


Answer



Consider your Test1 performs the following behavior:



char * x1 = NULL;

Test1 (x1);


Test1 is done within the following:



void test1 (char * t) / / t -> x1 -> null
{
t = (char *) malloc (11);
// t now points a different place (the memory allocated), and the reference of x1 continues pointing to null
strcpy (t, "1234567890"); // t value is "1234567890" but x1 continues pointing to null

// Error, the memory that is pointed by t is never released
}




printf ("\nTest1:%s \n", t1); / / Print the value of x1 (null) and the reference of t is lost

No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...