2012-06-23 77 views
0

我要實現所謂mymalloc具有以下簽名的malloc的包裝:void **作爲函數的參數有什麼用?

void mymalloc(int size, void ** ptr) 

是必須的,從而沒有類型轉換將在主程序和正確的指針的所有權需要的void**(無類型演員)仍然在main()

void mymalloc(int size, void ** ptr) 
{ 
    *ptr = malloc(size) ; 
} 
main() 
{ 
    int *x; 
    mymalloc(4,&x); // do we need to type-cast it again? 
        // How does the pointer mechanism work here? 
} 

現在,將指針傳遞需要被型鑄一遍,還是會得到隱式類型轉換?

我不明白這是如何工作的。

+1

爲什麼不嘗試編譯它(記得啓用編譯器警告),並找出? –

+0

@OliCharlesworth我想在這裏理解類型轉換機制(需要/不需要)。我會嘗試編譯它,雖然我沒有看到代碼的正確性,但是這個概念。 – Raulp

回答

3

malloc返回一個void*。對於您的功能,用戶需要首先創建自己的本地void*變量,併爲您指定指針;那麼你的函數預計會填充該變量。因此,你在簽名中有一個額外的指針,在你的函數中取消引用,並且在客戶端代碼中有一個地址 - 運算符。

的原型模式是這樣的:

void do_work_and_populate(T * result) 
{ 
    *result = the_fruits_of_my_labour; 
} 

int main() 
{ 
    T data;      // uninitialized! 
    do_work_and_populate(&data); // pass address of destination 
    // now "data" is ready 
} 

爲了您的使用示例,替代T = void *,和你的勞動成果是malloc(加校驗)的結果。

但是,請注意,int*void*不同,因此您不能僅將x的地址作爲空指針的地址關閉。相反,你需要:

void * p; 
my_malloc(&p); 
int * x = p; // conversion is OK 
+0

這將是無效的do_work_and_populate(T ** result)而不是void do_work_and_populate(T * result) – Raulp

+0

@so:不過請注意'T'可能本身就是一個指針類型! –

+0

太棒了!得到它了 ! – Raulp

2

void *相反,類型void **不是泛型指針類型,所以如果類型不同,則需要在賦值之前進行強制轉換。

+0

所以在返回frmo時,函數void ptr會被自動轉換爲int * ?? – Raulp

+0

存在從對象指針類型到'void *'類型的隱式轉換,但沒有向'void **'類型的隱式轉換。 – ouah

+0

好,所以在這裏* ptr(即void *類型將隱式轉換爲正在傳遞的指針的類型).Correct !! – Raulp

0
void ** ptr

這裏,「PTR」是一個指針的指針,並且可以被視爲一個指向指針數組。由於你的結果存儲在那裏(沒有從mymalloc返回),你需要澄清你想分配到「ptr」。 「大小」這個說法不夠充分。

相關問題