因此,我打算编写一个函数以返回随机数组元素。该函数接受两个参数-空指针数组和数组长度。它应该返回一个空指针。想法是采用给定数组,该数组以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 *randomNum(void * array, size_t size, size_t length)
现在,通过强制转换array
为char指针执行计算,这将强制array
以1字节乘以提供的size参数的增量进行算术运算:
result = (char*)array + (rand()%(length-1)) * size;
^ ^
然后,您可以使用 randomNum(array, sizeof(*array), 9)
但是,在取消引用函数之前,仍然需要转换该函数的返回值。
printf("%d\n", *(int*)randomNum(array,sizeof(*array),9));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句