c - 为什么我的 freeMem 函数需要 char* 和 addMem 函数 char**

标签 c malloc

也许标题很糟糕,但我会尽力解释可能的问题。

让我们看一下下面的程序:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void addMem1 ( char **arr, size_t size );
void freeMem ( char *ptr );

int main ( void )
{
    size_t size = 256;
    char *arr;

    addMem1( &arr, size );
    strcpy( arr, "Hello there!" );

    printf( "Arr = %s\n", arr );
    freeMem( arr ); ///I do not need a pointer to Pointer here

}

void addMem1 ( char **arr, size_t size  )
{
    *arr = calloc ( size * sizeof( **arr ), sizeof( **arr ) );
    if ( *arr == NULL )
    {
        printf("Error, malloc()\n" );
        exit( EXIT_FAILURE );
    }
}

void freeMem ( char *ptr )
{
    if ( ptr != NULL )
    {
        free( ptr );
    }
}

当我经过arr时至addMem()为了使它工作,我需要像这样传递它 &arr因为我不能使用mallocaddMem() .

这是 freeMem() 的另一个版本:

void freeMem ( char **ptr )
{
    if ( *ptr != NULL )
    {
        free( *ptr );
    }
}

当我调用它时,可以很好地使用:

freeMem( &arr );

这是错误的:

freeMem( arr );

具体是如何工作的 free()功能?

为什么有这个功能

void freeMem ( char *ptr );

仅使用单个指针即可工作? 我不需要这样定义它:

void freeMem ( char **ptr );

编辑:

更准确地说,我不明白为什么这个函数是错误的,当用在指针 arr 上时:

void addMem1 ( char *arr, size_t size  ) /// is wrong, need to pass by Reference
{
    arr = calloc ( size * sizeof( *arr ), sizeof( *arr ) );
    if ( arr == NULL )
    {
        printf("Error, malloc()\n" );
        exit( EXIT_FAILURE );
    }
}

但它确实有效:

void freeMem1 ( char *ptr ) /// here is by Value?
{
    if ( ptr != NULL )
    {
        free( ptr );
    }
}

在最后一个函数中我不需要引用?

最佳答案

How does exactly works free() function?

free()释放传递的值指向的内存地址。

free() 期望由 malloc()calloc()realloc() 返回值(或 NULL,其中 is 实际上什么也不做)。

关于c - 为什么我的 freeMem 函数需要 char* 和 addMem 函数 char**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54171000/

相关文章:

c - 长文件路径的 stat 替代方案

C - Malloc 和 memcpy(内存管理)

c++ - loop-malloc.c : No such file or directory vector 中的段错误

c - malloc 不确定性行为

c - 分配二维字符数组 malloc 或 calloc

C scanf 字符串数组

c - 我正在编写自己的 JIT 解释器。如何执行生成的指令?

c - 尝试使用 malloc 时出现段错误

c - 初始化结构体数组

c - fgets 的 n 参数的含义随着时间的推移而变化吗?