C 将Void指针转换为long double将产生垃圾

C 将Void指针转换为long double将产生垃圾,c,pointers,void-pointers,C,Pointers,Void Pointers,我制作了一个基本函数,它使用一个空指针,然后根据其类型处理输入 #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(

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

#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;
}
#包括
int writeVal(int-id,void*ptr,int-byteSize)
{
printf(“大小为%d”,字节大小);
if(byteSize==sizeof(int))
{
printf(“int%d”,*(int*)ptr);
}
if(byteSize==sizeof(float))
{
printf(“浮动%f”,*(浮动*)ptr);
}
if(byteSize==sizeof(double))
{
printf(“双%lf”,*(双*)ptr);
}
if(byteSize==sizeof(长双精度))
{
printf(“长双精度%lf”,*(长双精度*)ptr);
}
其他的
{
printf(“未知类型”);
返回1;
}
返回0;
}
内部主(空){
//你的密码在这里
长双i=30.0;
长双精度*ff=&i;
int-ret=writeVal(10,ff,sizeof(*ff));
返回0;
}
这适用于所有值,除非我传递了一个长的double,在这种情况下,它会给出一个垃圾值。为什么会这样


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

长双精度的正确格式说明符是
%Lf
(大写L),而不是
%Lf

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

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