如何从其他函数修改一个函数的局部变量?

时间:2017-02-06 16:26:01

标签: c

int main ()
{
    int a, b;

    call(&b);

    printf("%d, %d",a , b);    
}

void call(int *ptr)
{


}

期望的输出:

50, 100

如何编写调用函数以便修改这两个变量以获得所需的输出??

6 个答案:

答案 0 :(得分:2)

不确定值50100的来源或确切来自您的要求,但这可能会对您的问题有所帮助。

由于C是按值传递的,因此您需要发送指针以实际更改另一个函数内的值。

由于call函数将具有指针值,因此在更改值之前需要取消引用指针。

以下是一个例子:

void call(int *a, int *b)
{
    *a = 50;
    *b = 100;
}

int main()
{
    int a, b;

    call(&a, &b);

    printf("%d, %d\n", a, b);
}

答案 1 :(得分:1)

虽然我们正在探索可以实现此输出的多种方式,但请考虑该函数可以将状态存储在静态变量中:

#include <stdio.h>

void call(int *ptr);

int main(void)
{
    int a, b;

    call(&a);
    call(&b);

    printf("%d, %d\n",a , b);
}

void call(int *ptr)
{
    static int store = 0;

    store += 50;
    *ptr = store;
}

节目输出:

50, 100

请注意,您也可以按照以下方式执行此操作,而不对main()进行任何修改。但要注意此方法调用未定义的行为!写入数组对象末尾的位置是未定义的行为,并且在ab的情况下,这些被认为是大小为1的数组对象。这里我们假设这个写将起作用,并且ab在内存中彼此相邻存储。我们进一步假设a在内存中具有更高的地址。

我会说你永远不应该这样做,但我不知道在不知道a的地址的情况下从函数call()修改a的其他方法。你被警告了。

void call(int *ptr)
{
    *ptr = 100;
    *(ptr + 1) = 50;
}

答案 2 :(得分:0)

尝试这样的事情:

void call(int *ptr)
{
    *ptr = 100;
}

int main ()
{
    int a, b;

    a = 50;
    call(&b);

    printf("%d, %d",a , b);    
}

请参阅demo

答案 3 :(得分:0)

也许你想要这个:

int main ()
{
    int a, b;    
    call(&a, &b);    
    printf("%d, %d",a , b);    
}

void call(int *ptr1, int *ptr2)
{
  *a = 50;
  *b = 100;
}

答案 4 :(得分:0)

要通过调用函数a来更改函数b中的局部变量,您有两个选择。

1)让函数b返回一个赋值给函数a中的变量的值。像:

int b() {return 42;}

void a()
{
    int x = b();
    printf("%d\n", x);
}

然而,这似乎并不是你想要的。

2)将指向变量的指针传递给函数b,并通过该指针

更改变量
void b(int* p)  // Notice the * which means the function takes a pointer
                // to integer as argument
{
    *p = 42;    // Notice the * which means that 42 is assigned to the variable
                // that p points to
}

void a()
{
    int x;
    b(&x);      // Notice the & which means "address of x" and thereby
                // becomes a pointer to the integer x

    printf("%d\n", x);
}

答案 5 :(得分:0)

int main()
{

     int a,b;

     call(&b);

     printf("%d, %d\n", a,b);

}


int call(int *ptr)

{
    int  *m;

    m = ptr++;

    *ptr = 50;

    *m = 100;
}