2012-03-02 10 views
1

タスク:charポインタの配列を正しくコピーする方法はありますか?

は私が num_filtered_recordsでフィルタリングレコード数と、filtered_recordsにレコードの配列を持っています。この情報をbinfo->filtered_recordsbinfo->num_filtered_recordsに複製したいのですが、後でfiltered_recordsが私のコードの中で無料となります。

定義:

char** filtered_records; 
size_t num_filtered_records; 

スニペット:

binfo->filtered_records = malloc(num_filtered_records*sizeof(char*)); 

memcpy(binfo->filtered_records, 
     filtered_records, 
     num_filtered_records * sizeof(char*)); 

問題:

私はbinfo->filtered_recordsを印刷するとき、私はすべてのレコードを参照しますが、レコードの一部have は値が正しくありません。私は何が欠けているのか分かりません。

+0

filtered_recordsへのポインタをbinfo-> filtered_recordsまたは実際のデータにコピーしますか? – Gangadhar

答えて

4

実際にデータを複製していない場合、はポインタをコピーするだけです。その代わりmemcpyの、行うために:あなたはmalloc(strlen(filtered_records[i]) + 1)、その後strcpyを使用し、strdupを持っていない場合

for (i = 0; i < num_filtered_records; i++) 
    binfo->filtered_records[i] = strdup(filtered_records[i]); 

+0

大丈夫、私はそれを試み、質問を更新しました。 –

+0

@VaibhavBajpai最初の文字列はNULで終了しましたか?詳細を表示し、デバッグを行ってください。 – cnicutar

+0

うん、私は問題を解決した、ありがとう –

3

ポインタの配列を各値にコピーしていますが、は実際の値をコピーしていません。したがって、レコードそのものに発生する変更は、元のfiltered_recordsと新しいbinfo->filtered_recordsの両方に反映されます。

コピー後に各レコードのメモリをfiltered_recordsに解放する場合は、binfo->filtered_recordsのすべてのエントリが無効なメモリを指すようになりました。

cnicutarの答えは、実際のレコードを安全にコピーする方法を示しています。

関連する問題