Какой тип данных следует использовать для хранения адресов?

Как выбрать тип переменной для хранения адресов в вашей утилите, чтобы избежать случайных обращений к этим адресам? Может быть, есть готовые typedef'ы в языке C, которые могли бы помочь решить эту проблему?
  • 25 декабря 2023 г. 18:47
Ответы на вопрос 2
Для хранения адресов можно использовать тип данных "указатель" (pointer), который позволяет хранить адрес памяти. 

В языке C есть тип typedef под названием "void*", который может быть использован для хранения адресов различных типов. Тип данных "void*" определяет указатель на неопределенный тип данных, и поэтому может быть использован для хранения любого адреса, не зависящего от типа данных. 

Однако, следует быть внимательным при использовании "void*" указателей, так как они требуют явного приведения типов при обращении к данным, что может привести к ошибкам при неправильном использовании.

Для избежания случайных обращений к адресам и улучшения безопасности, можно использовать константные указатели (const pointers). Константные указатели предотвращают изменение адреса, на который они ссылаются, и защищают от случайных изменений.

Например, в C можно использовать следующий typedef для создания константных указателей:

typedef const int* const_ptr;

В этом примере typedef создает тип данных const_ptr, который является константным указателем на целочисленное значение.

Пример использования const_ptr:

const_ptr address1 = &variable; // инициализация константного указателя
int value = *address1; // чтение значения, на которое указывает константный указатель
*address1 = 10; // ошибка компиляции, так как константный указатель предотвращает изменение значения

Таким образом, использование константных указателей поможет избежать случайных обращений к адресам и обеспечит лучшую безопасность при работе с адресами в вашей утилите.
Что значит боитесь случайно обратиться к указателю? 
Сделайте указатель констатнтным, где это нужно,чтобы вы могли лишь посмотреть значение по указателю, но не могли изменить значение по указателю
Напишите класс-обертку, которая не возволит случайно изменить значение по указателю (переопределить operator* -> и так далее)

Возвращаясь к вашему вопросу: храните в любой переменной, которая может адресовать всю нужную вам память, но имейте в виду, что в век 64битных процессоров указатель должен иметь тип uint64_t большинстве современных платформ, иначе вы потеряете возможность адресовать большую часть памяти (если, конечно, ваша целевая платформа не MCU или что-то в этом роде)
Похожие вопросы