void * назначение на void ** - PullRequest
       7

void * назначение на void **

0 голосов
/ 10 декабря 2018

Необходимо реализовать один API, который имеет несколько параметров, который имеет тип ввода (const void *), тип вывода (void **);API хочет назначить вход с некоторым смещением для выхода;например,

void getOffset(const void* a, void** b)
{
    int offset = getsomeoffset();
    *b = a + offset; 
} 

Это будет иметь некоторые жалобы в компиляторе.Как правильно написать этот код?Тип входа может быть float, int, double.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Проблема здесь в смещении.A void не имеет размера, поэтому C не допускает арифметику указателей на void *.Предполагая, что вы хотите использовать байтовые адреса, вы должны пройти через char * арифметику:

void getOffset(const void* a, void** b)
{
    int offset = getsomeoffset();
    char *p = a;   // automatic conversion from void * to char *
    p += offset;   // char pointer arithmetics
    *b = p;        // automatic conversion for char * to void *
    // or directly:        *b = ((char *) a) + offset; 
}
0 голосов
/ 10 декабря 2018

Дано void *a, a + offset нарушает 6.5.6 Аддитивные операторы , пункт 8 стандарта C :

Когда выражение, котороеимеет целочисленный тип, добавляемый или вычитаемый из указателя, результат имеет тип операнда указателя .Если операнд-указатель указывает на элемент объекта массива , и массив достаточно велик ...

A void * не имеет типа, и онне может указывать на реальный объект.

Как уже отмечали другие, вы должны привести void * к другому типу, скорее всего, char * будет уместным.

0 голосов
/ 10 декабря 2018

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

Поэтому вам необходимо навести указатель перед применением смещения:

*b = ((char *)a) + offset; 

СВ этом операторе смещение интерпретируется как количество байтов.

...