如何在C中使用void指针作为函数返回类型

Jac*_*Zhu 6 c function void-pointers

所以我打算写一个函数来返回一个随机数组元素。该函数接受两个参数——一个空指针数组和数组长度。它应该返回一个空指针。这个想法是取给定的数组,它以空指针数组的形式出现,函数将返回数组的随机元素。我的问题是,我需要做什么才能返回一个指针,我需要对“结果”做什么才能像那样返回它?病房之后我需要做什么才能再次访问它?谢谢

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

 "25: error: invalid use of void expression"
Run Code Online (Sandbox Code Playgroud)

带有如下警告:

" warning: pointer of type ‘void *’ used in arithmetic"
Run Code Online (Sandbox Code Playgroud)

我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

tab*_*tab 4

你可以用这种方式编写一个完美的泛型函数,但是:

    result = array[rand()%(length-1)];
Run Code Online (Sandbox Code Playgroud)

这是取消引用 void 指针array,同时尝试将其存储到指针中result。您要存储的是该偏移处的地址:

    result = array + rand()%(length-1);
Run Code Online (Sandbox Code Playgroud)

但是,您也不能对 void 指针执行这样的算术,因为底层类型的大小未知(某些编译器允许sizeof(void)==1作为扩展)。对于非 void 数组,给定元素消耗的字节数以及对地址进行算术时要增加的字节数都编码在类型中。在像这样的对 void 指针进行操作的通用函数中,您需要显式传递类型的大小。

void *randomNum(void * array, size_t size, size_t length)
Run Code Online (Sandbox Code Playgroud)

array现在通过转换为 char 指针来执行计算,这强制算术array以 1 字节乘以提供的大小参数的增量进行:

    result = (char*)array + (rand()%(length-1)) * size;
                   ^                            ^
Run Code Online (Sandbox Code Playgroud)

然后你可以调用 randomNumrandomNum(array, sizeof(*array), 9)

但是,您仍然需要在取消引用函数之前转换函数的返回值。

    printf("%d\n", *(int*)randomNum(array,sizeof(*array),9));
Run Code Online (Sandbox Code Playgroud)