2012-01-04 17 views
0

を戻しながら:これはmainから呼び出されたときにコアダンプエラー私は機能を持っている機能から

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

、実行はこの関数の最後の行まで行き、その後

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

あなたのコードは」doesnのコンパイルして、それを動作させる方法がわかりません。あなたが持っている問題を示す完全な例を提供すれば、はるかに役立ちます。 –

答えて

1

retparamた場合の型キャストと

だったが、あなたがそれを渡す実際のstringのアドレスであり、そしてあなたが本当に返す前に何をしたいのか

です

retparamの値を設定することは、関数内のローカル変数であり、その値を変更しても親では何も変更されないため、良いことをしていません。しかし、あなたはそれを変更することができますそれポイントここに何が起こっている。

+0

しかし、 'retparam'はローカル変数です。 (それはポインタですが、ポインタ自体が値渡しされます)関数が復帰した後に何が使用しようとする可能性がありますか? – ruakh

+0

ああ、そうだね、思ったより悪いよ。私は更新します。 –

+0

@Ernestこれを解決するには – AKS

0

関数が戻るときに破壊されるローカル変数であるf2へのポインタを返しています。

0

私はここに暗闇の中で刺すのビットを取っているが、私はあなたの問題は、あなたがこのように機能をを定義しているかもしれないと思う:

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

いますが、将来をしています

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

(それは、戻り型stringではなくvoidを持っていることを約束する):次のように(?ヘッダファイルで)どこかでそれを宣言する。したがって、関数が返ってくると、呼び出しコードは戻り値を使用しようとします。そして、パンデモニウムは、ではないことが判明したときに起こります。

(つまりケース—ではありませんし、それがうまく—ではないかもしれないなら、私はあなたが完全な関数定義と、関数を呼び出すコードを掲示した場合、それが役立つだろうと思います。)

関連する問題