0

I have got problem in my program. After I use function fclose() I got error:

"* Error in `./server': corrupted double-linked list: 0x000000000251a230 * Przerwane (zrzut pamięci)"

If i delete fclose() function everythink is OK. This is code of my fuction:

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(see point 1.) ,然后在while循环中将其指向line (point 2.)。

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

所以,如果你想message指出line,那么就不要分配内存给message.

于 2016-01-01T18:08:02.173 回答
0

可能值得检查 object is not null

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

您不太可能使用getline. while循环有可能重复CONSOLE_BUFFER多次,并且您在returnArray. fclose()释放与流关联的缓冲区,free由于堆损坏而崩溃。

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

于 2016-01-01T18:03:02.373 回答