以安全的方式向任何其他人投射(无效*)

时间:2011-02-11 10:26:38

标签: c++ c curl

现在这样安全吗?

#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库时

3 个答案:

答案 0 :(得分:2)

积分除法将在添加0.99999之前发生,因此你将得到一个整数,可能是0,1,2,向它添加一个任意0.99999,它什么都不做,然后再把它强制转换为长。

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

也很难知道你想要达到的目的。

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

答案 1 :(得分:0)

就lee()和你的呼唤而言,是的,这是安全的。

答案 2 :(得分:0)

如前所述,(void *)是不必要的&amp;应该避免,直到你知道你在做什么。在有关的函数声明中,它只是意味着函数接受指向某事物的指针,但是“某事物”的类型并不重要。

E.g。

#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