2

Eclipse で gtk+ アプリケーションを作成しています。コードのある時点で、gtk+ hello world に似たコードを使用して警告ダイアログが表示されます。このプログラムを実行すると、ダイアログには期待どおりに「単語」の内容が表示されますが、ダイアログを閉じるとプログラムがクラッシュします。私はcが初めてなので、単純な間違いを見つけることを期待してデバッグでプログラムを実行しました。ただし、デバッグを実行すると、ダイアログに「単語」の前に多くのヌル文字が表示され、メッセージがログに記録されました。

Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

この新しい問題は紛らわしく、さらに混乱を招くことに、ダイアログを閉じてもプログラムはクラッシュしませんでした。

要約すると、コードを実行すると、テキストは問題なく、プログラムがクラッシュします。コードをデバッグすると、テキストが無効になり、プログラムはクラッシュしません。

ダイアログ内のテキストは、次のコードで生成されます。

char*  answerBuffer = (char*)malloc(strlen(s)+strlen(words)+1);

strcat(answerBuffer,words);

char*  answer = (char*)malloc(strlen(answerBuffer)+1);
g_strlcpy(answer,answerBuffer,strlen(answerBuffer)+1);

return answer;

コードが実行されると、answerBuffer の長さは 320 で、words は「a、b、c、d」に設定された char* 引数です。私は、gtk + 2.24を使用してminGWコンパイラを使用してEclipseを介してWindows XPでこれを実行しています。これをデバッグ/修正する方法を教えてもらえますか?

ps。「s」にはファイルからのテキストが含まれ、その後に 1 つまたは 12 個の null 文字が続きます (実行する場合は 1 つ、デバッグする場合は 12 文字)。

4

2 に答える 2

4

あなたが提供したコードを考えると、この行が問題です:

strcat(answerBuffer,words);

なんで?何が入っているかわからないからですanswerBuffer。Malloc は、返されるメモリが必ずしもゼロであるとは限らないため、answerBuffer本質的にランダムなバイトが含まれています。少なくとも最初のバイトをゼロにする必要があります (したがって、長さがゼロの文字列のように見えます)、または使用calloc()してバッファーを割り当てると、メモリがゼロになります。

于 2012-06-12T01:48:01.350 に答える
0

おそらく、's' の内容は有効な UTF-8 シーケンスではありません。

混乱する場合に備えて、UTF-8 とは何かを調べてください。または、簡単にするために、テキスト ファイルに ASCII 文字のみが含まれていることを確認してください。

それでも問題が解決しない場合は、おそらくファイルの読み取りまたはエンコード変換のどこかを台無しにしている可能性があります。

于 2012-06-11T23:51:46.223 に答える