Бросьте (void *) к любому другому безопасным способом - PullRequest
0 голосов
/ 11 февраля 2011

Теперь это безопасно?

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

2 голосов
/ 11 февраля 2011

Интегральное деление произойдет до добавления 0.99999, поэтому вы получите целое число, которое может быть 0, 1, 2, добавить произвольный 0.99999, который ничего не достигает, а затем привести его к длинному.

size1 все еще может быть 0, поэтому val[0] может быть недействительным.

Также трудно понять, чего вы пытаетесь достичь.

Чтобы ответить на ваш вопрос напрямую,не является безопасным.

0 голосов
/ 11 февраля 2011

Как уже было сказано (void *), они не нужны, и их следует избегать, пока вы не узнаете, что делаете. В соответствующем объявлении функции это просто означает, что функция берет указатель на что-то, но не имеет значения, что это за тип «что-то».

* 1003 Е.Г. *

#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
0 голосов
/ 11 февраля 2011

Что касается lee () и ваш звонок на него, да, это безопасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...