我有一系列调用,其中最后一次调用需要一个双指针。看来我总是得到一个空指针。我已将此简化为以下内容。最后一次调用是一个返回指针的库调用。
这是简化的混乱。 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 :)
}
答案 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
中的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 :(得分:0)
为了修改您需要通过引用传递的参数,您可以使用显式引用或指针来执行此操作。如果要更改的内容是指针,则需要引用指针或指针指针。