Как избежать предупреждения: приведение к указателю из целого числа разного размера?

#c #pointers

#c #указатели

Вопрос:

Я получаю предупреждение в приведенном ниже коде, т.е

 uint64_t val = 0x1234567812345678;
uint32_t addr = 0x12345678;
*(volatile uint64_t *)(addr) = val;
  
 $gcc  -o test test.c
test.c: In function ‘main’:
test.c:8:4: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   *(volatile uint64_t *)(addr) = val;
  

Это встроенная среда и попытка реализовать флэш-алгоритм, в котором можно запрограммировать только двойное слово.
Каков наилучший способ преобразовать uint32_t addr в uint64_t volatile address?

Комментарии:

1. Что вы пытаетесь сделать? Это вряд ли сработает, если вы не используете автономную среду (в основном на встроенной системе без операционной системы).

2. вы должны использовать uintptr_t вместо uint32_t .

3. Вопрос, который вы задаете в тексте, не соответствует коду. Вы хотите 64 -> 32 или 32 -> 64

4. Почему бы вам не попробовать *(volatile uint64_t *)(0x12345678) = val;

5. Если вы компилируете для встроенной среды, почему вы используете gcc ? Если вы компилируете из 64-разрядного Linux на ту же платформу, это может иметь смысл, но если вы выполняете кросс-компиляцию для другой системы, вам, возможно, придется использовать другой компилятор (поправьте меня, эксперты gcc, если я ошибаюсь).