传递void指针作为参数

时间:2016-05-08 21:54:24

标签: c void-pointers c89

所以我试图根据我的排序功能在这样的函数中获取值。

void * getBest(void *t, unsigned int n, unsigned int bytes, int (*vrt)(void *, void *)) {
  int i = 0;
  int returnI = 0;
  for(i = 0; i < n; i++) {
    if(i != returnI) {
    if(vrt(t[i], t[returnI]) == 1)  
    {
      returnI = i;
    }
    }
  }
  return t[returnI];
}

使用这样的排序功能:

int pieni_dbl(void *a, void *b)
{
  double *ad = a;
  double *bd = b;
  return *ad < *bd;
}

并称之为

  double *parasDbl = getBest(dt, 6, sizeof(double), pieni_dbl);
  short int *parasShort = getBest(st, 10, sizeof(short int), iso_itseis_short);

但是它给出了错误:算术中使用的'void *'类型的指针[-Wpedantic] if(vrt(t [i],t [paras])== 1)

为什么?有可能以某种方式将void指针作为参数传递给函数,并将其与ANSI c进行比较吗?

2 个答案:

答案 0 :(得分:1)

鉴于t具有类型void *,执行函数调用错误两次(或三次)错误...

vrt(t[i], t[returnI])

......,就像你一样。

首先,考虑表达式t[i]:它的类型是什么?当然,它的类型是void。这不是相应函数参数的正确类型(甚至也不是函数参数的允许类型)。

编译器甚至没有抱怨这个,但考虑其含义。由于t[i]的类型为void,因此该程序甚至可以尝试计算它? void有多大?实际上,它是未定义的,C禁止在void *上执行算术。

也许你说“好的,但算术在哪里”?好吧,C根据指针算法定义数组索引。您的表达式t[i]等同于*(t + i) - 瞧,禁止使用void *算术。

答案 1 :(得分:0)

原因是a[i]形式是*(a + i)的简写。因此,您正在撰写

if(vrt(*(t + i), *(t + returnI)) == 1)

但这涉及取消引用void *,这是禁止的。