C++ 从函数返回时出现核心转储错误

C++ 从函数返回时出现核心转储错误,c++,C++,我有一个功能: void function(const string param1, string *p2param, string *retparam) 当从main调用此函数时,执行一直持续到该函数的最后一行,然后以失败告终 Bus Error(coredump) 该函数使用指向字符串的指针执行一些字符串操作,然后将最终值传递给*retparam 代码是这样的aa.c string *f1;//global string f2= "abc";//global function_2()

我有一个功能:

void function(const string param1, string *p2param, string *retparam)
当从
main
调用此函数时,执行一直持续到该函数的最后一行,然后以失败告终

Bus Error(coredump)
该函数使用指向字符串的指针执行一些字符串操作,然后将最终值传递给
*retparam

代码是这样的aa.c

string *f1;//global
string f2= "abc";//global

function_2()
{
stringstream aa;
*f1 += aa<<"test";
//similar concatenation
 }
function(param1, *p2param, *retparam)
{
  /* assign back the values*/
  f1 =&f2;
  //call to a function from bb.c
  // from bb.c function_2() is in called
   retparam = f1
 }
是什么导致了这个错误

谢谢你们宝贵的意见,终于解决了我的问题

问题在于字符串变量的类型转换 代码片段

void function(const string param1, string *p2param, string *retparam)  {  
   //function to call from bb.c has prototype
    //fun2(const char **str,stubfunc)
    const char *l_str = param1.c_str();
    fun2((const char **) &l_str,coverage_hook);
}
//this was ealier called as 
//fun2((const char**) &param1,coverage_hook); hence was causing the core dump 
//why?? still dont know :)

如果传入时
retparam
是实际
string
的地址,那么在返回之前真正要做的是

(*retparam) = f2;

设置
retparam
本身的值对您没有任何好处,因为它是函数中的局部变量,更改其值不会更改父函数中的任何内容。但是你可以改变它指向的内存,这就是这里发生的事情。

你返回的是一个指向f2的指针,它是一个局部变量,当函数返回时会被破坏。

我在这里做了一点尝试,但我想你的问题可能是你这样定义函数:

void function(const string param1, string *p2param, string *retparam)
{
    .
    .
    .
}
string function(const string param1, string *p2param, string *retparam);
但您将在某处(在头文件中?)转发声明它,如下所示:

void function(const string param1, string *p2param, string *retparam)
{
    .
    .
    .
}
string function(const string param1, string *p2param, string *retparam);
(承诺它将具有返回类型
string
,而不是
void
)。因此,当函数返回时,调用代码尝试使用它的返回值,当发现没有返回值时,就会出现混乱


(如果情况并非如此——很可能并非如此——那么我认为如果您发布完整的函数定义以及调用该函数的代码,将会有所帮助。)

但是
retparam
是一个局部变量。(这是一个指针,但指针本身是通过值传递的。)函数返回后,怎么可能有任何东西试图使用它?请参阅我编辑的答案(可能)了解正确的解决方案。它依赖于
retparam
是真正
string
对象的真实地址。我认为您的更新版本是准确的,但我看不出它如何解决导致核心转储的任何问题。(我并不是说它不存在;我只是不知道它是如何产生的。我认为如果您解释导致核心转储的原因会有所帮助。)您的代码不可编译,并且不清楚如何使其工作。如果你能提供一个完整的例子来说明你所遇到的问题,这会更有帮助。