在函数填充后尝试访问指针成员时出现 SIGSEGV

SIGSEGV when trying to acces member of pointer after it was filled by function

答案可能非常简单,但我已经静静地盯着这段代码看了一会儿,我就是找不到解决方案。

这是我的问题。我有一个指向基数 class 的指针。然后我调用一个函数来查找从该 class 派生的对象向量中的元素。指针作为参数传递并填充找到的对象。如果我尝试读取指针指向的成员变量,我会得到一个 SIGSEV。

这是代码:

Base* control;
if(findControlByName("aName", control)) {
    std::cout << control->name << std::endl;  // SIGSEV happens here
}

//...

bool findControlByName(std::string name, Base* control) {
    for(size_t i = 0; i < controls.size(); i++) {
        if(controls[i]->name == name) {
            control = controls[i];
            std::cout << control->name; // this works
            return true;
        }
    }
    return false;
}

如何正确执行此操作?

详细说明我的上述评论,当您为函数中的指针参数赋值时,该值在函数范围内是局部的,就像按值传递的任何其他参数一样。在函数范围内为参数赋值不会在该函数范围之外更改它,除非它通过引用传递。

一个例子:

void someFunc(int * x)
{
  static int my_static = 5;
  x = &my_static;
}
void someFunc2(int * &x)
{
  static int my_static_2 = 7;
  x = &my_static_2;
}

//somewhere else:
int * ptr;
someFunc(ptr);
//ptr is unchanged/still uninitialized
someFunc2(ptr);
//ptr points to my_static_2

如果someFunc的签名改为采用引用参数,则参数将按引用传递,而不是按值传递。