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