释放未分配的指针

nop*_*ope 1 c memory memory-leaks

以下代码抛出错误:

mem(44582)malloc:*对象0x7f9f8a4000e0的错误:未释放指针被释放*在malloc_error_break中设置断点以调试Abort陷阱: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;
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rum 8

C是一种按值传递的语言.您对函数buffer内部所做的修改readstringbuffered()bufferin 的值没有影响main().如果realloc()有执行,你已经释放了buffermain知道的,当你返回时 - BAM - 双倍自由.

一种可能的解决方案是将指针传递给buffer,而不是传递给buffer自身.将签名更改readstringbuffered()为:

void readstringbuffered(char **buffer)
Run Code Online (Sandbox Code Playgroud)

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