Преобразование double в void * в C - PullRequest
6 голосов
/ 04 июля 2011

Я пишу интерпретатор, и я хотел бы иметь возможность хранить любое значение, которое функция возвращает в указатель void.У меня не было проблем с хранением целых чисел и различных указателей как пустых указателей, но я получаю сообщение об ошибке, когда пытаюсь привести двойное значение в качестве пустого указателя.Я понимаю, что двойные значения хранятся по-разному, чем целые числа и указатели на уровне битов, но я не понимаю, почему я не могу поместить любые биты, которые я хочу, в указатель (при условии, что ему выделено достаточно памяти), а затем вынуть их позже,приведение их к двойному типу.

Возможно ли приведение двойного к указателю void с использованием синтаксиса, о котором я не знаю, или я неправильно понимаю, как работают указатели void?

Ответы [ 3 ]

13 голосов
/ 04 июля 2011

Во многих системах double имеет ширину 8 байт, а указатель - 4 байта.Таким образом, первое не подходит к последнему.

Вы, похоже, злоупотребляете void*.Ваше решение будет включать выделение дискового пространства, по крайней мере, такого же большого размера, как самый большой тип, который вам нужно хранить в некоторой вариантной структуре, например, union.

2 голосов
/ 05 июля 2011

Конечно это можно разыграть Пустые указатели - это то, что делает полиморфизм возможным в C. Вы должны заранее знать, что вы передаете своей функции.

void *p_v ;
double *p_d ;
p_d = malloc( sizeof( double ) ) ;
p_v = ( void * ) p_d ;
0 голосов
/ 06 марта 2016

Вот оно

int main ( ) {
    double d = 1.00e+00 ; // 0x3ff0000000000000
    double * pd = & d ;
    void * * p = ( void * * ) pd ;
    void * dp = * p ;
    printf ( "%f %p %p %p \n" , d , pd , p , dp ) ;
    return 0 ;
} ;

выход

1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000

2-й и 3-й адреса могут отличаться. Ярлык

void * dp = * ( void * * ) & d ;

Приветствия

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