Увеличить указатель void на один байт?двумя? - PullRequest
32 голосов
/ 23 июня 2011

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

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

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

Ответы [ 4 ]

60 голосов
/ 23 июня 2011

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

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

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

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

// In C:
p = (char*)p + 1;
17 голосов
/ 23 июня 2011

Арифметические операции с указателем void невозможны.

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

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

5 голосов
/ 23 июня 2011

Просто увеличение 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);

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

0 голосов
/ 23 мая 2017

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

++(*((char **)(&ptr)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...