簡體   English   中英

如何為結構中的函數指針成員分配值

[英]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

不,由於多種原因,您不能像這樣進行分配:

  1. 函數指針與void*不兼容。 您的編譯器可能允許這樣做,但這是根據標准的未定義行為
  2. 通過使用[0][1]您不會對void指針進行指針算術運算,這也是不允許的。

同樣在第一個可行的示例中,您將指針分配給函數。 就像您所做的一樣,這是可以的,因為如果您不將()放在函數的末尾,則該函數將返回其地址。 但是我仍然發現在這種情況下寫&f更清晰。

暫無
暫無

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

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