所以我打算编写一个函数来返回一个随机数组元素。该函数接受两个 parameters——空指针数组和数组长度。它应该返回一个空指针。 这个想法是采用给定的数组,它以空指针数组的形式出现,函数将返回数组的随机元素。 我的问题是,我需要做什么才能返回指针,我需要对“结果”做什么才能像那样返回它?在 wards 之后我需要做什么才能再次访问它? 谢谢
这是我所做的,但我得到了:
"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)];
这是对空指针 array
的取消引用,同时还试图将其存储到指针 result
中。您要存储的是该偏移量处的地址:
result = array + rand()%(length-1);
但是,您也不能对 void 指针执行这样的算术运算,因为底层类型的大小是未知的(一些编译器允许 sizeof(void)==1
作为扩展) .对于非空数组,给定元素消耗的字节数,因此在对地址进行算术运算时要增加的字节数,在类型中进行编码。在像这样对 void 指针进行操作的通用函数中,您需要显式传递类型的大小。
void *randomNum(void * array, size_t size, size_t length)
现在通过将 array
转换为 char 指针来执行计算,这会强制 array
上的算术以 1 字节乘以提供的大小参数的增量发生:
result = (char*)array + (rand()%(length-1)) * size;
^ ^
然后您可以使用 randomNum(array, sizeof(*array), 9)
但是,您仍然需要在取消引用之前转换函数的返回值。
printf("%d\n", *(int*)randomNum(array,sizeof(*array),9));
关于c - 如何在 C 中使用 void 指针作为函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20016508/