簡體   English   中英

C:通過void *返回的函數

[英]C: Function returning via void *

來自Java我很困惑使用Void允許返回值如下:

void *emalloc(size_t s) {  
    void *result = malloc(s);  
    if (NULL == result) {  
        fprintf(stderr, "MEMORY ALLOCATION FAILURE\n");  
    exit( EXIT_FAILURE );  
    }  
    return result;  
}  

這會返回指向分配內存的指針嗎?

是的。 void *指針基本上是指向內存地址的通用指針,然后通常可以對實際需要的任何類型進行類型轉換。

您的問題表明您誤讀了函數的返回類型。 兩者之間有很大的不同:

void foo( void ) {}

void *bar( void ) {}

foo()不接受任何參數並且不返回值,而bar()不接受任何參數並返回通用指針。 在C中,關鍵字void用於表示通用指針,void *類型的對象可以轉換為任何其他對象指針類型而不會丟失信息。

是的,此函數返回指向指定大小的已分配內存的指針。 它在malloc中的不同之處在於它保證返回指針。 失敗時它將退出應用程序。

是。 void*意味着指向某事物的指針,但沒有特定的類型。

在Java中沒有指針算術。 它認為這就是你要問的問題。 例如,假設malloc返回int類型的指針

int* malloc(size_t size)
{
    //
}

你可能會收到指針,它基本上是一個指向array的指針。 然后你會像常規數組一樣索引它。

int* arr = malloc(10 * sizeof(int)); // 10 contiguous int(s).

問題是C沒有函數重載。 所以,我們必須找到一種編寫通用malloc 否則,您最終會為每種類型使用不同的malloc 解決方案是發送所需的字節數。 然后,您可以根據自己的喜好對其進行索引。 這為所有解決方案提供了更大的靈活性。

int*  i = (int*)malloc(10 * sizeof(int)); // 40 bytes if int = 4 bytes
char* c = (char*)malloc(10 * sizeof(char)); // 10 bytes if char = 1 byte

int  thirdElement = i[3]; // third element. 12 bytes away from (*i)
char secondElement = c[2]; // second element. 2 bytes away from (*c)

所以,整個想法是我們如何索引從malloc獲得的內存並不重要。 我們所要做的就是指定新創建的數組的類型以正確地對其進行索引。 void*表示這是一個指向內存的指針,我們還沒有指定如何索引。

void基本上沒有類型,所以如果我們有void * p; p是指向某事物的指針,但我們還沒有說出什么。

沒有指針的void是沒有因此void foo(void)是一個不帶參數並且什么都不返回的函數。

是的malloc返回一個指向一塊內存的指針,malloc不知道或不關心內存有什么類型,所以它的返回類型是void *

暫無
暫無

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

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