簡體   English   中英

將 memory 分配給 function 指針

[英]allocating memory to a function pointer

我有一個函數來添加兩個 no 並返回 (a+b)。 然后我創建了一個指向函數的函數指針。 想要為該 function 指針的數組分配 memory 並訪問它們。 代碼如下。

我的問題是使用 malloc 的以下行:

pp = (add_2nos*)malloc(5 * sizeof(add_2nos*))

sizeof(add_2nos*) 和 sizeof(add_2nos) 在編譯時沒有任何區別。 有的話有什么區別?? 另外,如果在我分配相同類型的 memory 時需要進行類型轉換...?

#include <stdio.h>
#include <stdlib.h>

int add(int a, int b) {
        return (a+b);
}

typedef int (*add_2nos)(int, int);     

int main() {

        add_2nos *pp; 
        
        // Defining an array of pointers to function add and accessing them
        pp = (add_2nos*)malloc(5 * sizeof(add_2nos*));
        pp[0] = add;
        pp[1] = add;
        printf("\n\nAdding two nos -- (14, 15): %d ", pp1[0](14, 15));
        printf("\nAdding two nos -- (16, 16): %d \n\n", pp1[1](16, 16));
}

sizeof(add_2nos*) 和 sizeof(add_2nos) 在編譯時沒有任何區別。 如果有的話有什么區別?

add_2nosvoid (*)(int, int) - 它是指向 function 的指針。

add_2nos*是一個void (**)(int, int) - 它是一個指針,指向指向 function 的指針。

因為在大多數架構上,所有指針都具有相同的大小,包括 function 指針和指向指針的指針,而malloc()只需要一個數字,它沒有區別。 無論如何,您想為5 function 指針(即5 * sizeof(add_2nos) )分配空間,而不是為指向 function 指針的5指針分配空間。

別想了,讓編譯器自己算出來: pp = malloc(5 * sizeof(*pp)); 是一種常見的模式。

另外,如果在我分配相同類型的 memory 時需要進行類型轉換...?

請參閱我們是否將 malloc 的結果轉換為 C

這個

pp = (add_2nos*)malloc(5 * sizeof(add_2nos*));

根據指向 function 指針的指針大小為您提供分配。 這可能與 function 指針相同,但可能不是。

pp = malloc(5 * sizeof(add_2nos));

或者

pp = malloc(5 * sizeof *pp);

您已將 typedef 的add_2nos用作“指向具有特定簽名的 function 的指針”的類型名,因此要分配此類指針的數組,您只需對其直接使用 sizeof (不取消引用),或在取消引用時使用 sizeof數組指針。

指針確定 memory 地址。 解釋這一點的最簡單方法是通過以下示例:

printf("%ld\n",sizeof(unsigned char));
printf("%ld\n",sizeof(unsigned char *));

在第一行中,打印了一個 unsigned char 的大小,即 1 個字節。 在第二行中,保存信息的指針的大小,其中 unsigned char 存儲在 memory 中。 這可能因編譯器/平台而異。 例如,在https://www.onlinegdb.com/online_c_compiler上打印 8 個字節的大小。

暫無
暫無

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

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