Подтвердить что ты не робот

Увеличивать указатель void на один байт? двумя?

У меня есть указатель на void, называемый ptr. Я хочу увеличить это значение на несколько байтов. Есть ли способ сделать это?

Обратите внимание, что я хочу сделать это на месте, не создавая никаких переменных.

Могу ли я сделать что-то вроде ptr = (void *)(++((char *) ptr));?

4b9b3361

Ответ 1

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

Вы можете, однако, направить указатель на char*, сделать арифметику на этом указателе, а затем преобразовать его обратно в void*:

void* p = /* get a pointer somehow */;

// In C++:
p = static_cast<char*>(p) + 1;

// In C:
p = (char*)p + 1;

Ответ 2

Никаких арифметических операций не может быть сделано с помощью указателя void.

Компилятор не знает размер элемента (ов), на который указывает указатель void. Вы можете наложить указатель на (char *), чтобы сделать это.

В gcc есть расширение, которое обрабатывает размер a void как 1. поэтому можно использовать arithematic на void*, чтобы добавить смещение в байтах, но с его использованием появился бы не переносимый код.

Ответ 3

Простое увеличение void* происходит в gcc:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int i[] = { 23, 42 };
    void* a = &i;
    void* b = a + 4;
    printf("%i\n", *((int*)b));
    return 0;
}

Он концептуально (и официально) ошибочен, поэтому вы хотите сделать его явным: отбросьте его на char*, а затем обратно.

void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);

Это делает очевидным, что вы увеличиваете количество байтов.

Ответ 4

Вы можете сделать:

++(*((char **)(&ptr)));