也许标题很糟糕,但我会尝试解释可能的问题。
让我们看一下以下程序:
#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
,其中实际上什么都不做)返回的值。