将指针参数传递给双指针参数

时间:2018-03-02 20:58:55

标签: c++

我有一系列调用,其中最后一次调用需要一个双指针。看来我总是得到一个空指针。我已将此简化为以下内容。最后一次调用是一个返回指针的库调用。

这是简化的混乱。 foo中的MainCaller始终为0,即使我知道(通过库测试方法)该对象确实存在。

void MainCaller(){
    foo_t *foo;
    MiddleProcessor(foo);
    // foo results as 0
}

void MiddleProcessor(foo_t *foo){
  if(1){
    ProcessorA(foo);
  }else{
    ProcessorB(foo);
  }
}

void ProcessorA(foo_t *foo){
    FinalCall(&foo);
}

void FinalCall(foo_t **foo){
    *foo = some_lib_call();
    lib_call_test_is_good_foo(foo); // true :)
}

3 个答案:

答案 0 :(得分:3)

问题在于你是按值传递指针而FinalCall永远不知道原始人的位置。

这些更改可能有所帮助:

void MainCaller(){
    foo_t *foo;
    MiddleProcessor(&foo); // Passing the address of foo means foo can be overwritten
    // foo results as 0
}

void MiddleProcessor(foo_t **foo){
  if(1){
    ProcessorA(foo);
  }else{
    ProcessorB(foo);
  }
}

void ProcessorA(foo_t **foo){
    FinalCall(foo);
}

void FinalCall(foo_t **foo){
    *foo = some_lib_call();
    lib_call_test_is_good_foo(foo); // true :)
}

答案 1 :(得分:2)

更改foo中的FinalCallfoo中的MainCaller无效。它们是不同的变量,为什么要改变另一个呢?

相反,你想要这样的东西

void MainCaller(){
    foo_t *foo;
    foo = MiddleProcessor();
}

foo_t* MiddleProcessor(){
  if(1){
    return ProcessorA();
  }else{
    return ProcessorB();
  }
}

foo_t* ProcessorA(){
    foo_t* foo;
    FinalCall(&foo);
    return foo;
}

void FinalCall(foo_t **foo){
    *foo = some_lib_call();
    lib_call_test_is_good_foo(foo); // true :)
}

答案 2 :(得分:0)

为了修改您需要通过引用传递的参数,您可以使用显式引用或指针来执行此操作。如果要更改的内容是指针,则需要引用指针或指针指针。