自定义 Malloc() 函数 :: 此语法是什么意思?
Custom Malloc() Function :: What Does this Syntax Mean?
我正在使用 nDPI 库编写 C 程序,available here。 (在 Ubuntu 机器上编码,GCC 编译器,nDPI 版本 3.2)nDPI 用于检查网络流量。该代码使用许多不同的结构来表示网络内容,例如网络流、网络协议、网络主机等。
所以我认为如果你想创建这些结构,你必须使用库的自定义 malloc()
和 free()
函数,这是有道理的。但是我很难理解函数原型。以下是 API 头文件中的几行相关代码:
/* Utility functions to set ndpi malloc/free/print wrappers */
void set_ndpi_flow_malloc(void* (*__ndpi_flow_malloc)(size_t size));
void set_ndpi_flow_free(void (*__ndpi_flow_free)(void *ptr));
考虑 set_ndpi_flow_malloc()
函数。在源代码的其他地方,定义了一个 struct nDPI_flow_info
,我看到代码中到处都使用了该结构。所以我假设 set_ndpi_flow_malloc()
是在堆上分配这些结构之一,可能用一些信息填充它,并且 return 指针。
但是我不明白这个函数的参数。如果非要我猜的话,我会说 set_ndpi_flow_malloc()
接受一个指向另一个函数的指针,称为 __ndpi_flow_malloc()
,并且该函数接受一个 size_t
整数作为参数。原来,在 API 头文件的其他地方有这个函数原型:
void * ndpi_flow_malloc(size_t size);
就是那种我需要的功能:我需要__ndpi_flow_malloc()
(名字前面两个下划线字符) 双下划线是什么意思?
另一个问题...如果 set_ndpi_flow_malloc()
是自定义 malloc()
函数,它不应该 return 指向已分配内存的指针吗?
另一个问题...我将如何在我的代码中实际编写它?像这样...?
struct nDPI_flow_info* myFlow;
set_ndpi_flow_malloc( (void*) &ndpi_flow_malloc( sizeof( struct nDPI_flow_info )) );
// ...use the struct...
set_ndpi_flow_free( &ndpi_flow_free* myFlow ) );
这不对。我不明白第二行return如何将指针赋值给变量myFlow
。
非常感谢任何建议或批评。谢谢!
完全披露::我也发布了这个问题here。
函数 set_ndpi_flow_malloc
实际上并不进行分配,但允许您设置进行分配的函数。它的参数是一个指向函数的指针,该函数接受一个 size_t
和 returns 一个 void *
,并且 参数 的名称是 __ndpi_flow_malloc
.
set_ndpi_flow_free
也是如此。它告诉库使用哪个函数作为它的自定义自由函数。
很可能,ndpi_flow_malloc
是默认的自定义分配器。因此,如果这是您要使用的函数,您可以执行以下操作将其设置为自定义分配函数:
set_ndpi_flow_malloc(ndpi_flow_malloc);
然后假设有一个名为 ndpi_flow_free
的类似默认自由函数,您可以这样做以将其设置为自定义自由函数:
set_ndpi_flow_free(ndpi_flow_free);
我不熟悉这个 API,但是根据你在这里发布的内容,它必须在内部分配内存来执行一些操作,并且它允许你指定它 allocator/deallocator应该使用它来做到这一点——它可以使用 vanilla malloc
和 free
来分配和释放内存,或者您可以传递一个自定义的 allocator/deallocator,它使用不同的分配方案或针对 logging/debugging 或其他什么。
为了便于阅读,我将重新命名。基本上假装我已经完成了
#define SNFM set_ndpi_flow_malloc
#define NFM __ndpi_flow_malloc
剩下的就是
void SNFM(void *(*NFM)(size_t size));
读作
SNFM -- SNFM
SNFM( ) -- is a function taking
SNFM( NFM ) -- parameter NFM
SNFM( (*NFM) ) -- is a pointer to
SNFM( (*NFM)( )) -- a function taking
SNFM( (*NFM)( size)) -- parameter size
SNFM( (*NFM)(size_t size)) -- is a size_t
SNFM( *(*NFM)(size_t size)) -- returning a pointer to
SNFM(void *(*NFM)(size_t size)) -- void
void SNFM(void *(*NFM)(size_t size)); -- returning void
所以基本上,set_ndpi_flow_malloc
的参数是一个指向函数的指针,该函数接受 size_t
和 returns 一个指向 void
的指针 - 即 malloc
或具有相同签名但做同样事情的函数:
set_ndpi_flow_malloc( malloc );
或
void *my_malloc( size_t size )
{
...
}
...
set_ndpi_flow_malloc( my_malloc );
这个函数不分配内存;相反,它是当库需要在内部分配内存时指定使用哪个分配器的方式。 set_ndpi_flow_free
对解除分配器做同样的事情——你可以使用标准库中的香草 free
,或者传递一个自定义的解除分配器:
set_ndpi_flow_free( free );
或
void my_free( void *ptr )
{
...
}
...
set_ndpi_flow_free( my_free );
我正在使用 nDPI 库编写 C 程序,available here。 (在 Ubuntu 机器上编码,GCC 编译器,nDPI 版本 3.2)nDPI 用于检查网络流量。该代码使用许多不同的结构来表示网络内容,例如网络流、网络协议、网络主机等。
所以我认为如果你想创建这些结构,你必须使用库的自定义 malloc()
和 free()
函数,这是有道理的。但是我很难理解函数原型。以下是 API 头文件中的几行相关代码:
/* Utility functions to set ndpi malloc/free/print wrappers */
void set_ndpi_flow_malloc(void* (*__ndpi_flow_malloc)(size_t size));
void set_ndpi_flow_free(void (*__ndpi_flow_free)(void *ptr));
考虑 set_ndpi_flow_malloc()
函数。在源代码的其他地方,定义了一个 struct nDPI_flow_info
,我看到代码中到处都使用了该结构。所以我假设 set_ndpi_flow_malloc()
是在堆上分配这些结构之一,可能用一些信息填充它,并且 return 指针。
但是我不明白这个函数的参数。如果非要我猜的话,我会说 set_ndpi_flow_malloc()
接受一个指向另一个函数的指针,称为 __ndpi_flow_malloc()
,并且该函数接受一个 size_t
整数作为参数。原来,在 API 头文件的其他地方有这个函数原型:
void * ndpi_flow_malloc(size_t size);
就是那种我需要的功能:我需要__ndpi_flow_malloc()
(名字前面两个下划线字符) 双下划线是什么意思?
另一个问题...如果 set_ndpi_flow_malloc()
是自定义 malloc()
函数,它不应该 return 指向已分配内存的指针吗?
另一个问题...我将如何在我的代码中实际编写它?像这样...?
struct nDPI_flow_info* myFlow;
set_ndpi_flow_malloc( (void*) &ndpi_flow_malloc( sizeof( struct nDPI_flow_info )) );
// ...use the struct...
set_ndpi_flow_free( &ndpi_flow_free* myFlow ) );
这不对。我不明白第二行return如何将指针赋值给变量myFlow
。
非常感谢任何建议或批评。谢谢!
完全披露::我也发布了这个问题here。
函数 set_ndpi_flow_malloc
实际上并不进行分配,但允许您设置进行分配的函数。它的参数是一个指向函数的指针,该函数接受一个 size_t
和 returns 一个 void *
,并且 参数 的名称是 __ndpi_flow_malloc
.
set_ndpi_flow_free
也是如此。它告诉库使用哪个函数作为它的自定义自由函数。
很可能,ndpi_flow_malloc
是默认的自定义分配器。因此,如果这是您要使用的函数,您可以执行以下操作将其设置为自定义分配函数:
set_ndpi_flow_malloc(ndpi_flow_malloc);
然后假设有一个名为 ndpi_flow_free
的类似默认自由函数,您可以这样做以将其设置为自定义自由函数:
set_ndpi_flow_free(ndpi_flow_free);
我不熟悉这个 API,但是根据你在这里发布的内容,它必须在内部分配内存来执行一些操作,并且它允许你指定它 allocator/deallocator应该使用它来做到这一点——它可以使用 vanilla malloc
和 free
来分配和释放内存,或者您可以传递一个自定义的 allocator/deallocator,它使用不同的分配方案或针对 logging/debugging 或其他什么。
为了便于阅读,我将重新命名。基本上假装我已经完成了
#define SNFM set_ndpi_flow_malloc
#define NFM __ndpi_flow_malloc
剩下的就是
void SNFM(void *(*NFM)(size_t size));
读作
SNFM -- SNFM
SNFM( ) -- is a function taking
SNFM( NFM ) -- parameter NFM
SNFM( (*NFM) ) -- is a pointer to
SNFM( (*NFM)( )) -- a function taking
SNFM( (*NFM)( size)) -- parameter size
SNFM( (*NFM)(size_t size)) -- is a size_t
SNFM( *(*NFM)(size_t size)) -- returning a pointer to
SNFM(void *(*NFM)(size_t size)) -- void
void SNFM(void *(*NFM)(size_t size)); -- returning void
所以基本上,set_ndpi_flow_malloc
的参数是一个指向函数的指针,该函数接受 size_t
和 returns 一个指向 void
的指针 - 即 malloc
或具有相同签名但做同样事情的函数:
set_ndpi_flow_malloc( malloc );
或
void *my_malloc( size_t size )
{
...
}
...
set_ndpi_flow_malloc( my_malloc );
这个函数不分配内存;相反,它是当库需要在内部分配内存时指定使用哪个分配器的方式。 set_ndpi_flow_free
对解除分配器做同样的事情——你可以使用标准库中的香草 free
,或者传递一个自定义的解除分配器:
set_ndpi_flow_free( free );
或
void my_free( void *ptr )
{
...
}
...
set_ndpi_flow_free( my_free );