我的程序有问题。
我使用函数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;
答案 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 *
。