首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不知道其在C中的类型的情况下将空指针强制转换为double

在不知道其在C中的类型的情况下将空指针强制转换为double
EN

Stack Overflow用户
提问于 2019-05-01 16:09:06
回答 1查看 543关注 0票数 0

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

代码语言:javascript
复制
void foo(void *v,int n){
    double *values;

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

因此,这将打印出正确的输出:

代码语言:javascript
复制
foo((double[]){1,2,3,4},4);

这将打印一个错误的输出:

代码语言:javascript
复制
foo((int[]){1,2,3,4},4);
foo((float[]){1,2,3,4},4);

所以..。在知道空指针可以是整数、浮点数或双精度数组的情况下,我能正确地将空指针转换为双精度一吗?有必要知道数组的长度吗?或者我可以通过某种方式来计算它?附注:不使用回调

EN

回答 1

Stack Overflow用户

发布于 2019-05-01 16:27:19

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

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

,是否有必要有数组的长度,或者我可以以某种方式计算它?

传递长度是必要的。

您可以将信息“隐藏”在结构中。

代码语言:javascript
复制
#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55933284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档