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

为什么我的freeMem函数需要char*和addMem函数char**,c,malloc,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;

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

让我们看一下以下程序:

#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 );
    }
}
当我调用它时,它可以与以下各项配合使用:

freeMem( &arr );
这是错误的:

freeMem( arr );
究竟是如何工作的
free()
函数

为什么是功能

void freemm(char*ptr)

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

freeMem( arr );
void freemm(字符**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 );
    }
}
在最后一个函数中,我不需要引用

究竟是如何工作的
free()
函数

解除分配传递值指向的内存地址


free()
需要由
malloc()
calloc()
realloc()
(或
NULL
,其中is实际上什么都不做)返回的值。

@alk对此表示抱歉。我更正了它。我不明白这一点,“因为我不能在
addMem()
中使用
malloc
”您确实使用了
calloc()
,这是
malloc()
的姐妹函数。您需要在谷歌上搜索“按值传递”和“按引用传递”,并了解它们之间的区别以及使用它们的时间。@n.m。也许你会明白,我并不理解。我相信我第一次就理解了你的问题。我相信你们不明白为什么我们要通过引用传递变量,什么时候需要,什么时候不需要。我相信这正是你所缺少的知识。我已经专业地编写了四分之一个世纪的C语言程序,在这段时间里,我看到很多人犯了完全相同的错误。这让我有信心做出这些断言,当然我也可能是错的。是的,我知道这一点。我不明白,为什么在
freeMem()
中不需要指向指针的指针。对于
malloc
我需要一个指向指针的指针。对于
free
而言,
char*
char**
都可以使用。为什么?看看这个并重新思考:这个
*&v==v
对每个变量都适用,包括pointers@MichaelB.:还要考虑一下
*
在这里做了什么:
*arr=calloc(…
So,
free()
只需要指针的值,而
calloc
需要指针?按照程序的设计方式,我将
freeMem(arr)
作为变量传递,而不是通过指针。我在注释中对此进行了更好的解释