C 如果我执行这个程序,我会得到;未能释放";。但在FREE函数中,它只是正确地释放内存

C 如果我执行这个程序,我会得到;未能释放";。但在FREE函数中,它只是正确地释放内存,c,dynamic-memory-allocation,C,Dynamic Memory Allocation,在这段代码中,我只调用了一个分配函数来动态分配内存,然后调用了FREE函数来释放内存,这两个函数只能正常工作。但是在调用自由函数后的主函数内部,为什么仍然测试指向内存的指针呢?这是因为自由函数内部的变量ptr是一个局部变量,更改它只会更改局部变量,函数外部的任何内容都不会被修改 您需要做的是通过引用传递变量,这是C不支持的。C只有通过值传递。但引用参数传递可以使用指针进行模拟。因此,您需要向指针传递一个指针: #include "stdafx.h" #include "stdlib.h" #in

在这段代码中,我只调用了一个分配函数来动态分配内存,然后调用了FREE函数来释放内存,这两个函数只能正常工作。但是在调用自由函数后的主函数内部,为什么仍然测试指向内存的指针呢?

这是因为自由函数内部的变量
ptr
是一个局部变量,更改它只会更改局部变量,函数外部的任何内容都不会被修改

您需要做的是通过引用传递变量,这是C不支持的。C只有通过值传递。但引用参数传递可以使用指针进行模拟。因此,您需要向指针传递一个指针:

#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
typedef struct
{
    int a ;
    char b;
    char c[50];
}TEST;

void *allocate(int count,int  size);
void FREE(TEST *ptr);
int _tmain(int argc, _TCHAR* argv[])
{
    TEST *test = NULL ;
    void *ptr = NULL ;
    ptr = allocate(2,sizeof(TEST));
    test = (TEST *)ptr;
    test->a = 1;
    test->b = 'A';
    strcpy(test->c,"siva");

    FREE(test);
    if(test != NULL) //here Im getting issues, test remains pointing address
        printf("\n Failed to free");
    else
        printf("\n Free Success");
    return 0;
}
void *allocate(int count,int  size)
{
    void *ptr;
    ptr = calloc(count,size); // here allocated successfully
    return ptr;

}
void FREE(TEST *ptr)
{
    free(ptr);
    ptr = NULL ; // Deallocated Successfully
}
使用操作员
的地址调用:

void FREE(TEST **ptr);

在函数内部,使用解引用操作符
*
访问原始指针变量。

您期望得到什么,以及为什么您认为更改局部变量会产生外部影响?另外:不要对函数使用所有大写字母。在C语言中,对于标识符的大小写几乎没有标准,但所有大写==宏都是公认的。
FREE(&test);