c - 释放未分配的指针

标签 c memory memory-leaks

以下代码会抛出错误:

mem(44582) malloc:* 对象 0x7f9f8a4000e0 错误:未分配正在释放的指针 * 在malloc_error_break 设置断点调试 中止陷阱:6

我不确定发生了什么。我正在释放我显式 malloc 的内存区域,它是否与传递指向另一个方法的指针有关?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 10

void readstringbuffered(char *buffer);

int main(int argc, char const *argv[])
{
    char *buffer = (char *)malloc(BUFFERSIZE);
    readstringbuffered(buffer);                                               
    printf("%s",buffer);
    free(buffer);

    return EXIT_SUCCESS;
}

void readstringbuffered(char *buffer) 
{
    FILE *source;
    source = fopen("hello.txt","r");
    int current_size = BUFFERSIZE;
    int len = 0;
    int c;
    while((c = fgetc(source)) != EOF)
    {
        if(len == current_size-1)
        {
            current_size *= 2;
            char *temp = (char *)realloc(buffer,current_size);
            if(!temp)
            {
                fprintf(stderr,"out of memory");
                exit(1);
            }
            buffer = temp;
        }
        buffer[len] = c;
        len++;
    }
    buffer[len] = 0;
}

最佳答案

C 是一种按值传递的语言。您对 buffer 所做的修改在你的里面 readstringbuffered()函数对 buffer 的值没有影响在main() .如果realloc()曾经执行过,你已经释放了buffermain知道,以及何时返回 - BAM - 双倍免费。

一个可能的解决方案是传递一个指向 buffer 的指针, 而不是 buffer本身。更改 readstringbuffered() 的签名成为:

void readstringbuffered(char **buffer)

然后使用*buffer在里面。在调用站点,您将使用 readstringbuffered(&buffer)传递必要的指针。

关于c - 释放未分配的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509217/

相关文章:

c - 文件压缩和代码

c - scanf 与 ^ 运算符

C++内存泄漏自动检测库

c++ - 犯一个愚蠢的内存错误

android - 创建位图时出现内存不足异常

函数中的 Swift UnsafeMutablePointer 内存分配和释放

c - 进程完成,退出代码 -1073741819 (0xC0000005) - C,Clion

c - 在 C 中相互定义结构体

android - 从广播接收器启动的 Activity 是否使用与应用程序相同的堆?

c - 关于 C 中的结构内存管理