使用fclose()后损坏的双链表

时间:2016-01-01 17:56:12

标签: c fclose ansi-c

我的程序有问题。 我使用函数fclose()后出错:

  

*`./server'出错:损坏的双链表:0x000000000251a230 *   Przerwane(zrzutpamięci)“

如果我删除fclose()功能,那么每个方面都可以。 这是我的功能代码:

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;

3 个答案:

答案 0 :(得分: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(请参阅1.点),然后在while循环中将其指向line(点2.)。

因此,您对先前分配的内存(并且这两个指针指向同一内存位置)的引用松散,因此如果您 free 它们,它将free相同的内存导致相同内存位置的双 free

因此,如果您想message指向line,请不要将内存分配给message

答案 1 :(得分:0)

可能值得检查对象不为空

if(fHandler != NULL)
    fclose(fHandler);

答案 2 :(得分:0)

您不太可能使用getline读取二进制UDP消息。 while循环有可能迭代超过CONSOLE_BUFFER次并且您在returnArray的末尾之外写入,从而破坏堆内部结构。 fclose()释放与流相关联的缓冲区,free由于堆损坏而崩溃。

顺便说一下,memcpy(messageNum, &i, sizeof(i));可能不正确。您没有发布函数原型,但您应该使用returnArray设置*messageNum = i;中存储的消息数量,尤其是如果类型不是uint32_t *