以下代码会抛出错误:
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()
曾经执行过,你已经释放了buffer
那main
知道,以及何时返回 - BAM - 双倍免费。
一个可能的解决方案是传递一个指向 buffer
的指针, 而不是 buffer
本身。更改 readstringbuffered()
的签名成为:
void readstringbuffered(char **buffer)
然后使用*buffer
在里面。在调用站点,您将使用 readstringbuffered(&buffer)
传递必要的指针。
关于c - 释放未分配的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509217/