c - 检测到 glibc,realloc() : invalid next size:X

标签 c glibc realloc

<分区>

我正在编写一个函数,用于一次获取文本文件一行的内容进行解析,而不知道该行的大小。如果我所做的只是获取行并打印它们,该函数就可以工作,但是一旦我尝试将内存分配给另一个局部变量,我就会收到 glibc 错误:

glibc detected *** ./mention: realloc(): invalid next size: 0x00000000010ac250 ***

具体来说,SEARCH_LENGTH 定义为 40,添加 (char * word) 会导致错误。

void testF(FILE * stream){
    char * line = calloc(SEARCH_LENGTH , sizeof(char));
    int lineScalar = 1;

    char * word = calloc(SEARCH_LENGTH, sizeof(char)); // adding this line causes the error

    while(fgets(line, SEARCH_LENGTH + 1, stream)!= NULL){ 

            while((*(line + (SEARCH_LENGTH*lineScalar -1)) != '\0') && (*(line + (SEARCH_LENGTH*lineScalar -1)) !='\n')){
                lineScalar++;

                line = realloc(line, sizeof(char)*SEARCH_LENGTH*lineScalar);
                assert(line);

                fgets(line + SEARCH_LENGTH*(lineScalar - 1), SEARCH_LENGTH + 1, stream);

            }// inner while

            lineScalar = 1;
            printf("Line:%s\n",line);
        }


        free(line);
        free(word);
}

谢谢

最佳答案

您在 中分配了 SEARCH_LENGTH 个字符,但随后立即告诉 fgets() 可以读取 SEARCH_LENGTH+1;如果这样做,它将损坏堆,准确地给出您所看到的那种错误消息。不要让 fgets() 写过你的 block 的末端!

关于c - 检测到 glibc,realloc() : invalid next size:X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19761219/

相关文章:

c - "SO_REUSEPORT"(OS X) 或 "SO_REUSEADDR"(Linux) 真的允许用户对多个套接字使用 recvfrom 吗?

c - 打印马里奥二号半金字塔 CS50

c - hsearch_r 是线程安全的吗?

c - 一个长选项,其 "val"恰好是 `0` ?

c - 是否允许在 POSIX 中复制未命名的信号量?

c - 重新分配一个 int 数组

c - 是否可以从多个线程写入同一文件的不同部分?

c - 使用结构实现一组,但出现错误

c - 重新分配内存会导致下一个大小无效

c - 为 recv() 中使用的缓冲区重新分配内存