为什么我的freeMem函数期望使用char *和addMem funcion char **

时间:2019-01-13 16:45:31

标签: 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传递它,因为我无法在malloc中使用addMem()。 / p>

这是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 );
    }
}

在上一个函数中我不需要引用吗?

1 个答案:

答案 0 :(得分:1)

  

free()功能到底如何工作?

free()将所传递的值指向的地址分配给内存。

free()期望由malloc()calloc()realloc()(或NULL,实际上不执行任何操作)返回的值。