указатель uint32_t на то же место, что и указатель uint8_t - PullRequest
0 голосов
/ 06 июня 2018
#include <iostream>

int main(){
    uint8_t memory[1024];
    memory[0] = 1;
    memory[1] = 1;
    uint32_t *test = memory;
    //is it possible to get a value for *test that would be in this example 257?
}

Я хочу создать указатель uin32_t на тот же адрес, что и указатель uint8_t.Возможно ли это без использования new (адрес)?Я не хочу потерять информацию по адресу.Я знаю, что указатели - это просто адреса, и поэтому я должен иметь возможность просто установить указатель uint32_t на тот же адрес.
Этот код выдает ошибку:

invalid conversion from 'uint8_t*' to 'uint32_t*' in initialization

Ответы [ 5 ]

0 голосов
/ 06 июня 2018

Как уже упоминалось, вы не можете конвертировать uint8_t * в uint32_t * из-за строгого правила наложения имен, вы можете конвертировать uint32_t * в unsigned char *, хотя:

#include <iostream>

int main(){
    uint32_t test[1024/4] = {}; // initialize it!
    auto memory = reinterpret_cast<unsigned char *>( test );
    memory[0] = 1;
    memory[1] = 1;
    std::cout << test[0] << std::endl;
}

это не переносимый код из-за Endianness , но, по крайней мере, не имеет UB.

0 голосов
/ 06 июня 2018
uint32_t *test =(uint32_t*) memory;

uint32_t показывает, что память, указанная test, должна содержать uint32_t.

0 голосов
/ 06 июня 2018

Это было бы нарушением так называемого Строгого правила псевдонима , поэтому это невозможно сделать.Печально, но факт.

Используйте memcpy для копирования данных, и во многих случаях компиляторы оптимизируют копирование памяти и генерируют тот же код, что и при приведении, но в соответствии со стандартом.

0 голосов
/ 06 июня 2018

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

Таким образом, нет никакого портативного способа использовать полученный номер.

0 голосов
/ 06 июня 2018

Что можно сделать с помощью reinterpret_cast:

uint32_t *test = reinterpret_cast<uint32_t*>(memory);

Имейте в виду, что вы используете тяжелые боеприпасы здесь.Подобные представления в памяти не рекомендуется и могут пойти не так, как надо (скажем, выравнивание).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...