How to change value of variable passed as argument in C? I tried this:
void foo(char *foo, int baa){
if(baa) {
foo = "ab";
} else {
foo = "cb";
}
}
and call:
char *x = "baa";
foo(x, 1);
printf("%s\n", x);
but it prints baa
why?
thanks in advance.
You're wanting to change where a char*
points, therefore you're going to need to accept an argument in foo()
with one more level of indirection; a char**
(pointer to a char
pointer).
Therefore foo()
would be rewritten as:
void foo(char **foo /* changed */, int baa)
{
if(baa)
{
*foo = "ab"; /* changed */
}
else
{
*foo = "cb"; /* changed */
}
}
Now when calling foo()
, you'll pass a pointer to x
using the address-of operator (&
):
foo(&x, 1);
The reason why your incorrect snippet prints baa
is because you're simply assigning a new value to the local variable char *foo
, which is unrelated to x
. Therefore the value of x
is never modified.
There are multiple issues:
void foo(char *foo, int baa)
{
if (baa)
foo = "ab";
else
foo = "cb";
}
This code changes the local pointer, but does nothing with it. To copy strings around, you need to use strcpy()
to keep the interface the same:
void foo(char *foo, int baa)
{
if (baa)
strcpy(foo, "ab");
else
strcpy(foo, "cb");
}
However, before doing that, you'd need to ensure that foo
in the function points at modifiable memory. The calling code needs to be modified to ensure that:
char x[] = "baa";
foo(x, 1);
printf("%s\n", x);
Alternatively, you can keep x
as a pointer and revise the function interface:
void foo(char **foo, int baa)
{
if (baa)
*foo = "ab";
else
*foo = "cb";
}
and the calling sequence:
char *x = "baa";
foo(&x, 1);
printf("%s\n", x);
Both mechanisms work, but do so in their different ways. There are different sets of issues with each. There isn't a single 'this is better than that' decision; which is better depends on circumstances outside the scope of the code fragments shown.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With