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

标签 c function void-pointers

所以我打算编写一个函数来返回一个随机数组元素。该函数接受两个 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)

调用 randomNum

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

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

关于c - 如何在 C 中使用 void 指针作为函数返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20016508/

相关文章:

C:要求用户输入一个字符串。编写一个函数,以字符串为参数,按照上述方法对消息进行加密并返回密文

c - 如何返回c中函数的指针

c - 在单个函数中初始化具有相同成员名称和成员计数的多个结构

javascript - 为什么 JavaScript 函数别名不起作用?

c - 类型为 void 的数组

c++ - 在 C++ 中管理隐式类型转换

c - 打印分配给函数指针的函数名称

范围可以用括号括起来并在 C 中返回一个值吗?

c++ - 带有模板函数的未解析外部符号

c++ - 将二维数组引入函数c++