在不知道C语言中类型的情况下将void指针强制转换为double

时间:2019-05-01 08:09:06

标签: c pointers casting void

我需要编写一个函数,该函数将一个空指针(表示一个数组)和一个代表数组长度的整数作为参数。在函数中,我需要将此空指针转换为双精度指针。问题是void指针可以表示整数或浮点数或双精度数的数组。 因此,如果void指针代表整数或浮点数的数组,以下内容显然不起作用:

void foo(void *v,int n){
    double *values;

    values=(double*)v;
    for(i=0;i<n;i++)
        printf("%f\n",values[i]);
}

所以这将打印正确的输出:

foo((double[]){1,2,3,4},4);

这将输出错误的输出:

foo((int[]){1,2,3,4},4);
foo((float[]){1,2,3,4},4);

那么...仅在知道它可以是整数或浮点数或双精度数组的情况下,是否可以将void指针正确地转换为双精度指针?并且是否必须具有数组的长度,或者我可以以某种方式计算它? P.s.不使用回调

1 个答案:

答案 0 :(得分:0)

  

仅在知道空指针可以是整数数组,浮点数或双精度数组的情况下,我才能正确地将void指针转换为双精度指针吗?

不,您不能。您需要以某种方式传递类型信息。

  

是否需要具有数组的长度,或者我可以通过某种方式进行计算?

必须传递长度。


您可以“隐藏”结构中的信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum etype { INTEGER, FLOAT, DOUBLE };
struct data {
    void *values;
    size_t n;
    enum etype type;
};

void foo(struct data *x) {
    int *xd = x->values;
    float *xf = x->values;
    double *xg = x->values;
    for (int k = 0; k < x->n; k++) {
        switch (x->type) {
            default: printf("%g ", xg[k]); break;
            case FLOAT: printf("%f ", xf[k]); break;
            case INTEGER: printf("%d ", xd[k]); break;
        }
    }
    puts("");
}

int main(void) {
    struct data x;

    x.values = malloc(4 * sizeof(int));
    ((int*)(x.values))[0] = 42;
    ((int*)(x.values))[1] = -1;
    ((int*)(x.values))[2] = 0;
    ((int*)(x.values))[3] = 999;
    x.n = 4;
    x.type = INTEGER;
    foo(&x);

    x.values = calloc(4, sizeof(float));
    x.type = FLOAT;
    float tmp = 3.14159;
    memcpy(((float*)(x.values))+1, &tmp, sizeof (float));
    foo(&x);
    free(x.values);

    x.values = calloc(4, sizeof(double));
    x.type = DOUBLE;
    ((double*)(x.values))[2] = 2.7182818;
    foo(&x);
    free(x.values);
}

请参见code running on ideone