【问题标题】:Void pointer cast to long double gives garbage [duplicate]转换为 long double 的 Void 指针会产生垃圾 [重复]
【发布时间】:2015-03-23 21:37:33
【问题描述】:

我制作了一个基本函数,它使用 void 指针,然后根据其类型处理输入。

#include <stdio.h>
int writeVal (int id, void *ptr, int byteSize)
{
    printf ("size is %d" , byteSize);
    if (byteSize == sizeof(int))
    {
    printf("int %d", *(int*)ptr);
    }
    if (byteSize == sizeof(float))
    {
        printf("float  %f", *(float*)ptr);
    }
    if (byteSize == sizeof(double))
    {
    printf("double %lf", *(double*)ptr);
    }
    if (byteSize == sizeof(long double))
    {
    printf("long double %lf", *(long double*)ptr);
    }
    else
    {
        printf ("Unknown Type");
        return 1;
    }
    return 0;
}

int main(void) {
    // your code goes here
    long double i=30.0;
    long double *ff=&i;
    int ret=writeVal(10, ff,sizeof(*ff));

    return 0;
}

这对所有值都适用,除非我传递一个 long double,在这种情况下它会给出一个垃圾值。为什么会这样?

其次,这是处理保存类型可以是任何数据的指针的最佳方法吗?

【问题讨论】:

  • 垃圾前是否打印“long double”?
  • 是的,它确实打印了 long double。
  • @Isaiah 那你推荐什么方法,有一个可以传递任何数据类型的函数,并且它必须能够打印它并执行其他操作?
  • 我只是注意到标准对指针转换几乎没有保证,但给出的答案似乎是你的问题。

标签: c pointers void-pointers


【解决方案1】:

long double 的正确格式说明符是 %Lf(大写 L),而不是 %lf

printf("long double %Lf", *(long double*)ptr);
//                   ^ here

【讨论】:

    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2014-10-28
    • 2020-05-08
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多