自定义 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 mallocfree 来分配和释放内存,或者您可以传递一个自定义的 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 );