C语言 为什么我的 freeMem 函数需要 char* 和 addMem 功能 char**



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

让我们看一下以下程序:

#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 = %sn", 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传递它,因为我不能在addMem()中使用malloc

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

在最后一个函数中,我不需要参考?

究竟如何运作free()运作?

free()解除分配传递的值指向的内存,地址。

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

相关内容

  • 没有找到相关文章