2016-01-26 5 views
1

Функция возвращает двойной указатель void, содержащий указатель на массив float, как я могу получить доступ к выходным данным?function with void double pointer output

void **pointer; 

    // function(void **ptr) 
    function(pointer); 

Этот указатель указывает на указатель типа float.

float *coords; 
    coords = (float*)malloc(3*500*sizeof(float)); //I know the amount of memory to be allocated 

Как я могу прочитать данные из этого двойного указателя void? Я довольно смущен.

ответ

0

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

void function(void ***ptr) 
{ 
    float *coords; 
    coords = (float*)malloc(3*500*sizeof(float)); 
    *ptr = (void **) &coords; 
    //do something 
    return; 
} 

main() 
{ 
    void **pointer; 
    function(&pointer); 
    /* Accessing first member of array allocated in function */ 
    printf("%f", (*((float **)pointer))[0]); 

} 

Если это цель, есть более простой способ :

void function(void **p) 
{ 
    float *coords; 
    coords = (float*)malloc(3*500*sizeof(float)); 
    *p = coords; 
    return; 
} 

main() 
{ 
    void *pointer; 
    function(&pointer); 
    printf("%f", ((float*)pointer)[0]); 
} 

Надеюсь, это поможет.

-1

Я буду иметь, чтобы сделать несколько предположений здесь вопрос остается неясным

я буду считать, что вы вызываете функцию таким образом:

void **pointer; 
function(pointer); 

Затем необходимо получить доступ к выход, так что

flow *coord = (float *) *pointer; 

Тогда вы дома бесплатно

0

Пожалуйста, проверьте ваш код. То, что вы публикуете, - это вздор - у вас есть неинициализированная переменная и передайте ее функции. Это неопределенное поведение и может привести к сбою или ухудшению до того, как функция даже начнет выполнение.

Я думаю, вы смущены тем, что вы называете «двойной указатель». Нет такой вещи, как «двойной указатель». Указатель указывает на что-то, он не является двухточечным. Указатель может указывать на int (int *) или на структуру T (struct T *) или на float * (float **). В float ** есть два *, но это не делает его «двойным указателем». Это обычный указатель, который указывает на то, что само по себе является указателем.

Указатели как функциональные параметры чаще всего используются, поэтому функция может возвращать более одного значения. Скажем, функция get_width_and_height возвращается к Интс:

void get_width_and_height (int* width, int* height) { 
    *width = 10; 
    *height = 20; 
} 

int x, y; 
get_width_and_height (&x, &y); 

Теперь с этим, например, в виде, как бы вы написать функцию, которая возвращает два Int и один поплавок *?

+0

Хорошо, извините за путаницу, у меня есть функция (void ** point), что мне нужно сделать, чтобы получить доступ к выходным данным. Я знаю, что если бы это была функция (с плавающей точкой * указатель), я бы объявить указатель с плавающей точкой: поплавка * указатель // а затем выделить память указателя = (поплавок *) таНосом (3 * 18139 * SizeOf (с плавающей точкой)); // а затем распечатать данные, которые я сделал бы: printf (указатель «% f» [0]); В чем дело с указателем void **? И как его инициализировать?как вы упомянули. – ionas