How to change value of variable passed as argument?

一曲冷凌霜 提交于 2019-12-16 19:56:21

问题


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.


回答1:


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.




回答2:


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.




回答3:


You question is titled in a generic way. You've already got answers for your specific problem. I'm going to add couple of illustrative examples for int and double types.

#include <stdio.h>

void incrementInt(int* in, int inc)
{
   *in += inc;
}

void incrementDouble(double* in, double inc)
{
   *in += inc;
}

int main()
{
   int i = 10;
   double d = 10.2;

   printf("i: %d, d: %lf\n", i, d);

   incrementInt(&i, 20);
   incrementDouble(&d, 9.7);

   printf("i: %d, d: %lf\n", i, d);
}

Output:

i: 10, d: 10.200000
i: 30, d: 19.900000



回答4:


in function foo, you are changing argument foo only locally. when function foo ends, argument x is still x. You didn't change it in foo. you only copied it and called foo.

also, look at @Greg Hewgill comment.



来源:https://stackoverflow.com/questions/9459691/how-to-change-value-of-variable-passed-as-argument

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!