簡體   English   中英

如何使用void指針作為函數返回類型在C中

[英]how to use void pointer as function return type In C

所以我計划寫一個函數來返回一個隨機數組元素。 該函數接受兩個參數 - 一個void指針數組和數組長度。 它應該返回一個void指針。 我們的想法是采用給定的數組,它以void指針數組的形式出現,該函數將返回數組的隨機元素。 我的問題是,我需要做什么來返回指針,我需要對“結果”做什么,所以我可以這樣返回它? 在病房之后我需要做什么才能再次訪問它? 謝謝

這是我所做的,但我得到了:

 "25: error: invalid use of void expression"

警告如下:

" warning: pointer of type ‘void *’ used in arithmetic"

我的代碼:

#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void *randomNum(void * array, int length)
{
    void * result;  
    result=array[rand()%(length-1)];
    return result;
}    
int main()
{
int i;
srand(13);
int array[9]={1,5,6,85,132,65463,1354,5863,134};

for (i=0;i<9; i++)
{
    printf("%d\n",*randomNum(array,9));
}



return 0;
}

您可以通過這種方式編寫完美的通用函數,但是:

    result = array[rand()%(length-1)];

這是取消引用void指針array同時也嘗試將其存儲到指針result 您要存儲的是該偏移處的地址:

    result = array + rand()%(length-1);

但是,您無法對void指針執行此類算法,因為底層類型的大小未知(某些編譯器允許sizeof(void)==1作為擴展名)。 對於非void數組,給定元素消耗的字節數,以及在對地址進行算術運算時增加的字節數,在類型中進行編碼。 在像這樣的void指針上運行的泛型函數中,你需要顯式傳遞類型的大小。

void *randomNum(void * array, size_t size, size_t length)

現在通過將array轉換為char指針來執行計算,這會強制對array進行算術運算,其增量為提供的size參數的1個字節乘以:

    result = (char*)array + (rand()%(length-1)) * size;
                   ^                            ^

然后,您可以使用randomNum(array, sizeof(*array), 9)調用randomNum randomNum(array, sizeof(*array), 9)

但是,您仍需要在解除引用之前強制轉換函數的返回值。

    printf("%d\n", *(int*)randomNum(array,sizeof(*array),9));

該方法存在許多問題:

1)由於參數array的類型為void * ,因此根據length對其進行索引的計划將不起作用 - 索引工作,數組中每個元素的長度也需要知道。 您似乎正在嘗試創建一個適用於任何類型數組的泛型函數,但老實說,為不同類型的數組創建單獨的函數更簡單。

(要了解為什么這是有問題的,請記住, array[index]等效於*(array + index) ;通過索引void *您將指針算法應用於然后取消引用void指針 。請冥想。)

2)當你執行*randomNum(array, 9)時,你正在取消引用一個void指針。 這是不可能做到的; 你需要首先將指針轉換為適當的類型,即*((int *)randomNum(array, 9)) ,但正如我上面所說的,使用randomNum處理void指針的整個方法是有問題的,所以只需更改整件事:

int *randomNumInt(int *array, size_t length)

你的問題(導致錯誤的那個)是: *randomNum(array,9)

請記住,randomNum的返回類型是void * ,您可以取消引用它。 因此表達無效。 這對編譯器沒有多大意義,它會發出錯誤。

現在,我不太清楚為什么你聲明randomNum返回void* ,你可能只是將它聲明為int 您有效地將數組值轉換為void * ,這將指向某個開頭的內存 - 一個無效的位置。 如果你要將指針強制轉換為int* ,那么你的程序會出現段錯誤。

您不能在程序中取消引用像*randomNum(array,9)這樣的void指針。 在使用void指針執行任何操作之前,您必須先將其void

暫無
暫無

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

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