c - free() 在 c 代码中收集垃圾值,即使在释放后将指针设置为 NULL,代码也不起作用

标签 c pointers memory-management memory-leaks free

当我尝试调用 free() 函数来释放内存时,它无法正常工作。这是我的代码:

unsigned char *indata;
unsigned char *outdata;

int file_func(const char *filename) {
//some other variables

for(i=0;i < no_of_files;i++) {
indata = malloc(sizeof(unsigned char));
outdata = malloc(sizeof(unsigned char));

//counts the number of characters from filename
numCharacters = readfile(filename, indata); 

/* perform some operation on indata and get outdata(size is same as indata)*/

writefile(filename, outdata);   //writes outdata to filename

    free(indata);
    free(outdata);
    }
}

上面的代码无法正常工作,因为 free() 在 indata 和 outdata 中存储了一些随机垃圾值(因为它们变成了悬挂指针)。所以我尝试在释放后将指针设置为空,因为我重用了与以下相同的指针:

    free(indata);
    indata = NULL;
    free(outdata);
    outdata = NULL;

即便如此,我的代码也会崩溃:

双重释放或损坏(输出):0x00000000025aa240 *

我怎样才能克服这个问题,或者有没有其他方法可以在循环中使用动态大小的指针。谢谢。

最佳答案

您只需为每个变量分配 1 个字节 (sizeof(unsigned char))。这是一个错误,您想要分配 sizeof(unsigned char) * some_number 其中 some_number 是动态的,或者您可以只在堆栈上分配:

unsigned char indata, outdata; // then use &indata and &outdata where you need a pointer

unsigned char indata[some_number];
unsigned char outdata[some_number];

或者您可以在循环之前 malloc 一次并在循环之后释放一次。

双重释放问题看起来像是您在循环中调用的函数之一正在调用释放。仔细看readfile和writefile。

关于c - free() 在 c 代码中收集垃圾值,即使在释放后将指针设置为 NULL,代码也不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18965133/

相关文章:

c - 如何更改以下 LINUX 的 Makefile,使其在 MACOS 上也能运行

c - 2 个链表的交集

c - 在 C 中将指针与函数一起使用时出现错误

C指针数组

memory-management - 重用变量但进程没有释放内存是否视为内存泄漏?

c++ - 是否存在不在其分配中存储元数据的自定义内存分配器设计模式?

java - 关于java堆内存和系统RAM

c++ - read() 缓冲区有无效数据(指针问题?)

c - 使用 popen() 打开的文件描述符上的 pclose() 返回 errno 10(无子进程)

C:从 void* 读取 int**