[英]Custom Malloc() Function :: What Does this Syntax Mean?
我正在使用 nDPI 庫編寫 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
。
任何建議或批評都非常感謝。 謝謝!
完全披露:: 我也在這里發布了這個問題。
函數set_ndpi_flow_malloc
實際上並不進行分配,但允許您設置進行分配的函數。 它的參數是一個指向一個函數的指針,該函數接受一個size_t
並返回一個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,但根據你在這里發布的內容,它必須在內部分配內存來執行一些操作,它允許你指定它應該使用哪個分配器/釋放器來做到這一點 - 它可以使用 vanilla 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 做同樣的事情——你可以使用標准庫中的vanilla free
,或者傳遞一個自定義deallocator:
set_ndpi_flow_free( free );
或者
void my_free( void *ptr )
{
...
}
...
set_ndpi_flow_free( my_free );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.