[英]How can I assign values to a function pointers members in a structure
struct a
{
int (*ptr1)();
int (*ptr2)();
int data;
};
typedef struct
{
struct a x;
}all;
int fun1()
{
return 5;
};
int fun2()
{
return 9;
};
我可以分配像
all *mem = (all*)malloc(sizeof(all));
mem->x.ptr1 = fun1;
mem->x.ptr2 = fun2;
還有其他方法可以分配這些函數指針嗎? 可以這樣分配嗎?
all *mem;
(void **)mem->ptr1[0] = fun1;
(void **)mem->ptr2[1] = fun2;
不,這是不可能的(我假設您實際上是指以下內容,因為您的代碼沒有多大意義)
((void **)&mem->ptr1)[0]=fun1;
((void **)&mem->ptr1)[1]=fun1;
這在語法上是正確的,但是引用了C標准:
結構對象內可能存在未命名的填充,但在其開始處沒有。
這意味着您無法保證((void **)&mem->ptr1)+1 == ((void **)&mem->ptr2)
。
您發布的聲明
(void **)mem->ptr1[0] = fun1;
實際上意味着
(void **)((mem->ptr1)[0]) = fun1;
試圖索引一個功能指針。
請注意,根據您的定義,所有類似mem->x.ptr1
mem->ptr1
等的引用實際上應該是mem->x.ptr1
。
不,由於多種原因,您不能像這樣進行分配:
void*
不兼容。 您的編譯器可能允許這樣做,但這是根據標准的未定義行為 [0]
和[1]
您不會對void
指針進行指針算術運算,這也是不允許的。 同樣在第一個可行的示例中,您將指針分配給函數。 就像您所做的一樣,這是可以的,因為如果您不將()
放在函數的末尾,則該函數將返回其地址。 但是我仍然發現在這種情況下寫&f
更清晰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.