我正在使用nDPI库available here编写C程序。 (在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()
是要在堆上分配这些结构之一,也许在其中填充一些信息,然后返回指针。
但是我不理解该函数的参数。如果我不得不猜测,我会说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()
函数,它不应该返回指向已分配内存的指针吗?
另一个问题...我该如何在代码中实际编写呢?这样...?
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 ) );
那是不对的。我不明白第二行如何返回指针并将其分配给变量myFlow
。
任何建议或批评都会受到赞赏。谢谢!
完全披露::我也发布了这个问题here。
答案 0 :(得分:2)
函数set_ndpi_flow_malloc
实际上并不执行分配,但是允许您设置执行该功能的函数。它的参数是指向一个函数的指针,该函数采用size_t
并返回void *
,并且 argument 的名称为__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);
答案 1 :(得分:2)
我对这个API不熟悉,但是根据您在此处发布的内容,它必须在内部分配内存以执行某些操作,并且它允许您指定执行该操作应使用的分配器/释放器-它可以要么使用普通的malloc
和free
来分配和取消分配内存,要么可以传递使用不同分配方案的自定义分配器/取消分配器,或者用于记录/调试或其他操作的工具。
为便于阅读,我将重命名。基本上假装我已经完成
#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
并返回指向void
的指针-即malloc
或具有具有相同功能的相同签名:
set_ndpi_flow_malloc( malloc );
或
void *my_malloc( size_t size )
{
...
}
...
set_ndpi_flow_malloc( my_malloc );
此函数不分配内存;相反,这是您指定在库需要在内部分配内存时要使用哪个分配器的方式。 set_ndpi_flow_free
与deallocator的作用相同-您可以使用标准库中的香草free
,也可以传递自定义deallocator:
set_ndpi_flow_free( free );
或
void my_free( void *ptr )
{
...
}
...
set_ndpi_flow_free( my_free );