У меня есть последовательность вызовов, где для окончательного вызова требуется двойной указатель. Кажется, что я всегда получаю нулевой указатель в конце. Я упростил это до следующего. Последний вызов - это вызов библиотеки, который возвращает указатель.

Это упрощенный беспорядок. 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 :)
}
c++
0
J Doe. 2 Мар 2018 в 23:58

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 :)
}
3
quamrana 2 Мар 2018 в 21:05

Изменение foo в FinalCall не влияет на foo в 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
john 2 Мар 2018 в 21:02

Чтобы изменить параметр, вам нужно передать по ссылке, что вы можете сделать с явной ссылкой или указателем. Если вы хотите изменить указатель, вам нужна ссылка на указатель или указатель на указатель.

0
Mark Ransom 2 Мар 2018 в 21:10