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

标签 c++ pointers segmentation-fault

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

这是我的问题。我有一个指向基类的指针。然后我调用一个函数来查找从该类派生的对象 vector 中的元素。指针作为参数传递并填充找到的对象。如果我尝试读取指针指向的成员变量,我会得到一个 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的签名改为采用引用参数,则该参数将通过引用传递,而不是通过值传递。

关于c++ - 在函数填充后尝试访问指针成员时出现 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28842620/

相关文章:

c++ - Eigen,RowXpr 的函数

c++ - 为什么我必须为文件末尾的 seekg 提供负两个偏移量

c++简单的while循环不循环

c++ - 在 C++ 中将模板对象自动转换为模板指针

c++ - 尝试访问类的字符串成员时出现段错误

c - 将 memcpy 与 void 指针一起使用时出现段错误 - C

c++ - 除非引用,否则不会创建模板类的静态成员

c - 需要帮助来理解 free() 函数在 C 中的工作原理

c++ - 带有 2 个列表的面向对象

c - 通过链接器运行程序时出现段错误?