在函数填充后尝试访问指针成员时出现 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
的签名改为采用引用参数,则参数将按引用传递,而不是按值传递。
答案可能非常简单,但我已经静静地盯着这段代码看了一会儿,我就是找不到解决方案。
这是我的问题。我有一个指向基数 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
的签名改为采用引用参数,则参数将按引用传递,而不是按值传递。