2012-01-04 66 views
0

回來時,我有一個函數:核心轉儲錯誤,而從功能

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**) &param1,coverage_hook); hence was causing the core dump 
//why?? still dont know :) 
+0

你的代碼沒有按」 t編譯,並不明顯如何使其工作。如果您提供展示您遇到問題的完整示例,它將更有幫助。 – 2012-01-04 05:35:38

回答

1

如果retparam的類型轉換爲實際string的,當你在傳遞給它的地址,然後你真正想要返回之前做的是

(*retparam) = f2; 

設置retparam本身的值本身並沒有什麼好處,因爲它是函數中的局部變量,並且更改其值不會改變父項中的任何內容。但你可以將它的內存更改爲,這就是發生在這裏的情況。

+0

但'retparam'是一個局部變量。 (它是一個指針,但指針本身是按值傳遞的。)在函數返回後,怎麼可能會嘗試使用它? – ruakh 2012-01-04 05:03:27

+0

哦,你說得對,比我想象的要糟糕。我會更新。 – 2012-01-04 05:04:36

+0

@Ernest現在,然後如何解決這個 – AKS 2012-01-04 05:04:50

0

您正在返回一個指向f2的指針,該指針是函數返回時被破壞的局部變量。

0

我走了一下這裏的黑暗中刺,但我覺得你的問題力量是你定義這樣的功能:

void function(const string param1, string *p2param, string *retparam) 
{ 
    . 
    . 
    . 
} 

但你正向像這樣的地方,宣佈它(在頭文件):

string function(const string param1, string *p2param, string *retparam); 

(承諾,這將有返回類型string而非void)。所以當函數返回時,調用代碼會嘗試使用它的返回值,並且在出現不是之一時發生混亂。

(如果不是這種情況—,它可能不會是—那麼我認爲,如果你發佈的全功能的定義,以及調用該函數的代碼,這將有助於。)