0

プログラムに問題があります。関数を使用した後、fclose()エラーが発生しました:

" * `./server' のエラー: 破損した二重リンク リスト: 0x000000000251a230 * Przerwane (zrzut pamięci)"

fclose()が機能を削除すれば、everythinkはOKです。これは私の関数のコードです:

FILE *fHandler;
struct udp_message **returnArray;
struct udp_message *message;
char *line = NULL;
uint32_t linesNum;
uint32_t i = 0;
size_t length; 
ssize_t read;

fHandler = fopen(filePath, "r");
if (fHandler == NULL) {
    perror("ERROR");
    return NULL;
}

returnArray = malloc(sizeof(struct udp_message *)*CONSOLE_BUFFER);
message = malloc(sizeof(struct udp_message));

while ((read = getline(&line, &length, fHandler)) != -1) {
    message = (struct udp_message *)line;
    if (message->messageTime < aboveTime) {
        continue;
    }

    returnArray[i] = malloc(sizeof(struct udp_message));
    memcpy(returnArray[i++], message, sizeof(struct udp_message));
}

memcpy(messageNum, &i, sizeof(i));
fclose(fHandler);

return returnArray;
4

3 に答える 3

2

コードのこの部分を参照してください-

message = malloc(sizeof(struct udp_message));       /* <--- 1 */

while ((read = getline(&line, &length, fHandler)) != -1) {
   message = (struct udp_message *)line;            /*  <--- 2.  */
   if (message->messageTime < aboveTime) {
       continue;
   }

message(point を参照) にメモリを割り当てます1.が、whileループではline (point 2.) を指すようにします。

したがって、以前に割り当てられたメモリへの参照が失われます(これらのポインタは両方とも同じメモリ位置を指しています)。したがって、 free それらを使用するとfree、同じメモリが同じメモリ位置の2倍 free になります。

messageしたがって、を指すようにしたい場合はline、 にメモリを割り当てないでくださいmessage

于 2016-01-01T18:08:02.173 に答える
0

オブジェクトがnullでないことを確認する価値があるかもしれません

if(fHandler != NULL)
    fclose(fHandler);
于 2016-01-01T18:01:00.273 に答える
0

でバイナリ UDP メッセージを読み取れる可能性は低いですgetlinewhileループがCONSOLE_BUFFER何度も繰り返され、 の末尾を超えて書き込みreturnArray、ヒープの内部構造が破損する 可能性があります。fclose()ストリームに関連付けられたバッファを解放しfree、ヒープの破損が原因でクラッシュします。

ちなみに、memcpy(messageNum, &i, sizeof(i));おそらく間違っています。関数プロトタイプを投稿しませんでしたが、特にタイプが でない場合は、 に保存されるメッセージの数を設定する必要がreturnArrayあり*messageNum = i;ますuint32_t *

于 2016-01-01T18:03:02.373 に答える