2011-02-11 71 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