C кастинг из uint32_t * в void * - PullRequest
4 голосов
/ 17 ноября 2011

У меня есть вопрос о приведении указателя для C.

, если у меня есть функция с такой подписью:

uint8_t input_getc(void)

, которая читает пользовательский ввод из STDIN.

Тогда у меня есть указатель

void* buffer

, в котором я сохраняю возвращаемые значения из input_getc() in. Каким будет правильный способ приведения этого?

//read user input
for(i = 0; i < SIZE; ++i)
{
    uint8_t temp = input_getc();

    //copy to void* buffer
    *(uint8_t *)(buffer + i) = temp //WAY #1
    *(buffer + i) = (void *)temp;   //WAY #2
}

Они оба одинаковые?

Спасибо

Ответы [ 3 ]

8 голосов
/ 17 ноября 2011

Как сейчас, ни один из этих методов не скомпилируется.Поскольку buffer является void*, вы не можете выполнять арифметику с ним, поскольку он имеет неизвестный размер.

Не совсем ясно, где именно вы пытаетесь его сохранить.Если вы просто пытаетесь сохранить uint8_t в ячейке памяти, на которую указывает buffer со смещением i, то это можно сделать так:

((uint8_t*)buffer)[i] = temp;

РЕДАКТИРОВАТЬ:

Хорошо, очевидно, арифметика на void* разрешена в C, но не в C ++.Однако при этом все равно считалось небезопасным поведение.

См. Этот вопрос: Арифметика указателя для пустого указателя в C

2 голосов
/ 17 ноября 2011

Я не понимаю, что вы подразумеваете под

 copying to  `void* buffer`

но если вы делаете следующее, то way1 правильный

int main()
{
    int i;
    char a[10];
    void *buffer;
    buffer = &a;   // buffer is void* type pointer and its pointing to some buffer then
    for(i = 0; i < 10; ++i)
    {
        uint8_t temp = 65;

        //copy to void* buffer
        *(uint8_t *)(buffer + i) = temp; //WAY #1

    }
    printf("\n %s",a);
}

БОЛЬШОЙ Редактировать:

IN WAY1

вы добавляете + i offcet с буфером void *, и все же весь результат становится пустым *, затем вы типизируете весь этот результат с помощью uint8_t *, затем получаете доступ к этому значению, чтобы оно работало

но в пути2 вы добавляете + i offcet с пустым пространством * буфер все равно весь результат равен void *, а затем вы получаете это значение ... , что совершенно неверно .. Вы получите предупреждение / ошибку здесь

 warning: dereferencing ‘void *’ pointer

Еще одно редактирование:

вы не можете разыменовать указатель void *, но вы можете выполнить арифметическую операцию со значением указателя (не его значением pointe)

2 голосов
/ 17 ноября 2011

Один из способов сделать это:

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