现在这样安全吗?
#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库时
答案 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