我有一个功能:
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
}
我能得到的唯一信息是:
pstack core
$ pstack core
core 'core' of 4517: aa_test -t 745
ffffffff7c67109c __1cDstdMbasic_string4Ccn0ALchar_traits4Cc__n0AJallocator4Cc___2T5B6M_v_ (ffffffff7fffce98, 1002805fc, 10010cc90, 0, ffffffff7c8c3bd8, ffffffff7fffce98) + 14
0000000100004498 main (10010b000, 100000, ffffffff7fffce98, ffffffff7fffcf00, ffffffff7fffd288, ffffffff7fffd0b8) + 818
0000000100003a7c _start (0, 0, 0, 0, 0, 0) + 17c
导致此错误的原因是什么?
感谢您有价值的投入,最终解决了我的问题。
问题在于字符串变量的类型转换 代码段
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**) ¶m1,coverage_hook); hence was causing the core dump
//why?? still dont know :)
答案 0 :(得分:1)
如果retparam
是您传递的实际string
的地址,那么在返回之前您真正想要做的是
(*retparam) = f2;
设置retparam
本身的值对你没有任何好处,因为它是函数中的局部变量,并且更改其值不会改变父级中的任何内容。但是你可以改变它指向的内存,这就是这里发生的事情。
答案 1 :(得分:0)
您正在返回一个指向f2的指针,这是一个在函数返回时被销毁的局部变量。
答案 2 :(得分:0)
我在黑暗中采取了一些刺激,但我认为你的问题可能是你正在定义这样的函数:
void function(const string param1, string *p2param, string *retparam)
{
.
.
.
}
但你是在某处(在头文件中)向前声明它是这样的:
string function(const string param1, string *p2param, string *retparam);
(承诺它将具有返回类型string
而不是void
)。所以当函数返回时,调用代码会尝试使用它的返回值,并且当它结果出现时,会发生混乱不是。
(如果情况并非如此 - 而且可能不是 - 那么我认为如果发布完整的函数定义以及调用函数的代码会有所帮助。)