c - 释放缓冲区导致无效读取

标签 c segmentation-fault buffer free

我的缓冲区是一个来自文件的长字符串。然后我逐字添加到二叉树中作为节点。

如果我尝试释放不再使用的缓冲区,则会出现段错误。 Valgrind 指出了很多“Invalid read of size 1”错误。

如果我将它移到我的清洁支架上。它有效,但我遇到了严重的内存泄漏(因为程序可以读取更多文件)。

if (argc < 2) {
    printf("No arguments was passed to proccess.\n");
    return EXIT_SUCCESS;
} else {
    for (int i = 1; i < argc; i++) {                        
        FILE *file = openFile(argv[i]);
        if (file != NULL) {
            validFiles++;
            // Get size of file and setting up a buffer
            int fileSize = getFileSize(file);
            buffer = calloc(fileSize + 1, sizeof(char));

            fread(buffer,sizeof(char),fileSize,file);
            fclose(file);
            // Break down the buffer into a tree of nodes
            pch = strtok (buffer,delimiters);       
            while (pch != NULL) {
                root = insert(root, pch, argv[i], 1);
                pch = strtok (NULL, delimiters);
            } // free(buffer); should be here
        }           
    }
}

if (validFiles > 0) {       
    searchBook(root);       
    freeTree(root);
    free(buffer); // Only frees one of the buffers when multiple files are sent in
}

每个节点都会在树插入函数中为自己分配内存。

最佳答案

strtok 将修改它获取的缓冲区并返回该缓冲区内部 的指针。因此,当您将 strtok 返回的 pch 存储到您的二叉树中时,它会保存一部分 buffer。然后当您 free(buffer) pch 并且树中的值变得无效时,导致您的无效读取错误。

复制pch,然后再将其放入树中。如果可用,您可以使用 strdup .如果没有,则有一个版本 here .

关于c - 释放缓冲区导致无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666874/

相关文章:

c - 输入缓冲区获取输入,C 编程

c - 在 C/C++ 宏中通过 __VA_ARGS__ 迭代添加分隔符

c - 在c中的函数中分配struct的char成员

c - c 中的分数移位

c - 写 3 条指令是否用逗号分隔 `,` 未定义行为?

c - (另一个)关于 C 循环和数据结构的问题

c++ - 使用 boost::serialization 保存数据时出现段错误

C、atoi()产生段错误

ios - iOS流式MP3文件

java - sc.hasNextInt() 什么时候等待输入?