1

私はglib2.0APIを利用しています。CSVファイルを読み取り、g_strsplit関数を使用してコンマの間のデータを取得しています。以下は私のコードです:

gchar* record = get_record_from_file();
printf("Record: %s\n", record); <--- WORKS CORRECTLY
gchar** data = g_strsplit(record, ",", 6); <-- ERROR HERE
free(record);

splitメソッドを使用すると、エラーが発生します。これが私の出力です。

記録:2,0.4,2,0,1,10、

*glibcが検出されました* /path / to / my / project:free():無効な次のサイズ(通常):0x0000000001c06a00 ***

エラーをグーグルで検索してみました。どうやら、この質問と回答から、エラーはメモリに関係しています:

これは、メモリエラーがあることを意味します。mallocによって割り当てられていないポインターを解放しようとしている(またはnewによって作成されていないオブジェクトを削除しようとしている)か、そのようなオブジェクトを複数回解放/削除しようとしている可能性があります。バッファがオーバーフローしたか、書き込みを行うべきではないメモリに書き込みを行っている可能性があり、ヒープが破損している可能性があります。

g_strsplitは正しく呼び出されていますか?なぜこのエラーが発生するのですか?

Doc

文字列:分割する文字列。

区切り文字:文字列を分割する場所を指定する文字列。max_tokensに達しない限り、区切り文字は結果の文字列のいずれにも含まれません。

max_tokens:文字列を分割する最大ピース数。これが1未満の場合、文字列は完全に分割されます。

戻り値:新しく割り当てられたNULLで終了する文字列の配列。g_strfreev()を使用して解放します。

4

2 に答える 2

2

あなたはg_strsplitそのように呼ぶべきです

gchar **data = g_strsplit (result, ",", 6);

その理由は、g_strsplitがNULLで終了する文字列を期待し、後でNULL文字を含まない単一文字のメモリアドレスdelimiter&delimiter与えるため、メモリを上書きするためです。

于 2013-03-17T12:31:19.417 に答える
1

私は何が問題なのかを理解しました。バッファのサイズが小さすぎてデータを保持できないため、このエラーが発生しました。増やしたところ、エラーはなくなりました。

于 2013-03-17T13:48:32.067 に答える