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

标签 c fclose ansi-c

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

"* Error in `./server': corrupted double-linked list: 0x000000000251a230 * Przerwane (zrzut pamię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;

最佳答案

查看这部分代码-

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.)。

因此您丢失了对先前分配的内存的引用(并且这两个指针都指向相同的内存位置),因此如果您 释放 < em>它们,它将释放相同的内存,导致双倍 释放 相同的内存位置。

所以,如果你想让message指向line,那就不要给message分配内存。

关于使用 fclose() 后损坏的双链表;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34558562/

相关文章:

在结构中使用函数指针数组时崩溃

PHP:使用fopen检查图像文件是否存在

c - 如果我在 fopen() 失败时使用 fclose() 会发生什么(可能)

c - 什么会导致 fwrite 挂起?

使用realloc更改c中数组的大小

c - 我应该使用 "-ansi"还是显式 "-std=..."作为编译器标志?

c - 我如何在 C 中创建一个真正的随机数 (IDE : MPLAB)

C 数组初始化 - 一些基础知识

c - 如何仅使用 ansi-c 在 Windows 计算机上连接 GPIB 设备

c - 按出发日期排序航类