2011-02-11 38 views
-1

现在是否安全?以安全方式抛出(void *)到其他任何地方

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

+2

什么是你想用这个代码O.O该做,什么是你的“安全码”的定义? – 2011-02-11 10:30:37

+3

这是一个`void *`,它没有*安全*关于它... – Nim 2011-02-11 10:32:32

+0

你的代码泄漏内存。 – GManNickG 2011-02-11 10:46:09

回答

2

积分部门将0.99999的加入之前发生时,因此,你会得到一个整数,它可以是0,1,2,我不使用该指针的翻译,但添加任意达到0.99999的任何东西都没有,然后再投入长时间。

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

这也很难知道你想达到什么。

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

0

据lee()和你的电话去,是的,它是安全的。

0

如前所述,无效(无效*)&应该避免,直到你知道你在做什么。在相关的函数声明中,它只是意味着该函数接受一个指向某个东西的指针,但它与'something'的类型无关。

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 
相关问题