【问题标题】:Cast (void *) to any other in a safe way以安全的方式将 (void *) 转换为任何其他人
【发布时间】:2011-02-11 10:26:37
【问题描述】:

现在安全吗?

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

long lee( void *v1)
{
     long i1;
     memcpy(&i1,v1,sizeof(long));
     return i1;
}

//Added conversion to double:
double lee_d( void *v1)
{
     double i1;
     memcpy(&i1,v1,sizeof(double));
     return i1;
}

void main()
{
     long val=1777777;

     long ii;
     ii=lee((void *) &val);

     double dd=377e-177;
     dd=lee_d((void *) &dd);
     ii=ii;
}

在 MS studio 下运行良好。

我不使用这个指针翻译,但在使用 curl 库时

【问题讨论】:

  • 你想用这个代码做什么 O.O 你对“安全代码”的定义是什么?
  • 这是一个void*,它没有任何安全...
  • 请格式化您的代码。
  • 你不需要投射到void*,所以不要这样做。事实上,如果你把这个程序归结为它的本质,你最终会得到像int main() { return 0; }这样的东西。
  • 你是对的。但是我已经将这种转换与传递 (void *) 参数的 Curls 函数一起使用

标签: c++ c curl


【解决方案1】:

积分除法将在添加 0.99999 之前发生,因此您将得到一个整数,可能是 0、1、2,向其添加任意 0.99999,但没有得到任何结果,然后将其转换回 long。

size1 可能仍为 0,因此 val[0] 可能无效。

也很难知道你想要达到什么目标。

直接回答你的问题,不安全。

【讨论】:

    【解决方案2】:

    就 lee() 和您对它的调用而言,是的,它是安全的。

    【讨论】:

    • 对不起,我在你回答之前回答了-Pleyades-
    【解决方案3】:

    如前所述, (void *) 是不必要的,应该避免使用,直到您知道自己在做什么。在相关的函数声明中,它只是意味着函数需要一个指向某物的指针,但“某物”的类型是什么并不重要。

    例如

    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    
    static void doit(int *);        // Function Prototypes.  VERY IMPORTANT.
    static void doitAgain(void *);
    
    int main(int argc, char *argv[]) {
    
        int i = 0x12345;
        doit(&i);
        doitAgain(&i);
    
    }
    
    
    static void doit(int *b) 
    { 
    
        int *foo = malloc(sizeof(int));
    
        memcpy(foo, b, sizeof(int));
    
        fprintf(stdout, "foo is 0x%x\n", *foo);
    }
    
    static void doitAgain(void *b) 
    { 
    
        int *foo = malloc(sizeof(int));
    
        memcpy(foo, b, sizeof(int));
    
        fprintf(stdout, "foo is 0x%x\n", *foo);
    }
    

    当我们运行它时:

    $ make
    cc     main.c   -o main
    $ ./main 
    foo is 0x12345
    foo is 0x12345
    

    【讨论】:

    • 问题是一旦你“知道你在做什么”,你就很少使用void*。您希望类型尽可能具体,void* 是最不具体的。一旦您对类型了解任何信息,就不要使用void*。在此示例中,doItAgain(void*)b 是什么(大小或知道它可以逐位转换为 int 的知识)做出假设。 @David Victor 说“‘某事’是什么无关紧要”是完全正确的。在这个问题中给出的所有示例中,“某物”是什么确实重要,因此不应使用void*
    • 是的。代码示例的重点是向您展示 don't 需要 (void *) - 没有 它可以正常工作。但是,如果/当您需要时,“很少”使用它......因为示例函数(现在神奇地)是静态的 - 我可以做出一些假设......无论如何我也不会这样做。艰难的人群;-)
    • [quote]因此 void* 不应使用[/quote] 然后不要使用 phread 库或 Curl 库: int pthread_create(pthread_t thread, const pthread_attr_t *attr, void *(* start_routine)(void), void *arg);
    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多