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 - 如何将函数中的一个参数作为 void 指针参数转换为整数

c - 想要打印给定数组中具有相同数字的数组元素,例如 2222、11、888888 等。 {1, 121,222,44,451,5510,414}

c++ - 获取文件数据后刷新 cout 的问题

c - 索引 'mallocced' 数组时出现段错误

java - 在 Java 中为字节数组实现缓冲区

c - C 中连续元素的总和

c - 高斯消除期间段错误(核心转储)

c - 为什么第二个代码出现段错误?

c - 如何用同一个缓冲区写入两个不同的地方? (C-系统调用)

javascript - 如何在本地通过UDP数据包发送大于1500字节的 float 并解析它们