簡體   English   中英

Malloc是一組函數指針

[英]Malloc an array of function pointers

我有一組函數需要在運行時分配才能按順序調用。 哪個函數指針以編程方式確定哪個點,例如:

void ((drawFunctions*)(...))[0] = drawTriangle;
...
for(...)
    drawFunctions[i](...);

我想要malloc一個函數指針數組,因為直到運行時我才知道需要多少個。 你會怎么做?

typedef可能會使語法更具可忍性:

typedef void (*drawFunctionPointer)(void);
drawFunctionPointer *drawFunctions = malloc(sizeof(drawFunctionPointer) * numFunctions);

首先,在C99中, 可變函數應該至少有一個第一個非變量參數(比如printf有一個const char*fmt第一個參數)。 stdarg(3)

然后,為了便於閱讀,我將使用typedef來聲明函數簽名,例如

 typedef void drawfun_sigt (int, ...);

聲明一個包含指向指針數組的指針的變量:

 drawfun_sigt** parr = NULL;

分配它(並處理失敗):

 size_t nbfun = somenumber();
 parr = malloc(nbfun*sizeof(drawfun_sigt*));
 if (!parr) { perror("malloc"); exit(EXIT_FAILURE); };

清除它(為了使行為更具可重復性,我不喜歡malloc -ed數組中未初始化的元素;但是cmaster評論說valgrind會發現這些錯誤); 你可以使用calloc而不是malloc

 memset (parr, 0, nbfun*sizeof(drawfun_sigt*));

然后適當填寫

 extern void drawfunfoo(int, ....);
 parr[0] = drawfunfoo;

當然,有很多方法可以獲得函數地址。 在POSIX系統(特別是Linux)上,您甚至可以使用dlopen(3)dlsym(3)通過其名稱動態獲取此類地址

如果您的函數指針具有完全未知的簽名(即,如果省略號...在您的問題中意味着除了可變參數函數之外的東西),您應該使用libffi (或者,如果已知簽名集,則使用函數指針的union ) 。 請注意,C實現上的調用約定 (和ABI )可能(並且經常)指示調用具有不同簽名的函數的不同方法。 例如, x86-64 ABI for Linux要求可變函數和非可變函數以不同方式調用,並在寄存器中傳遞一些形式參數(整數和浮點的不同寄存器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM