адрес памяти, литерал - PullRequest
       16

адрес памяти, литерал

5 голосов
/ 29 августа 2010

Учитывая буквальный адрес памяти в шестнадцатеричном формате, как я могу создать указатель на C, который обращается к этому месту памяти?

Адреса памяти на моей платформе (IBM iSeries) 128 бит. Тип C long long также 128 бит.

Представьте, что у меня есть адрес памяти для строки (массив символов): C622D0129B0129F0

Я предполагаю, что правильный синтаксис C напрямую обращается к этой ячейке памяти:

const char* const p = (const char* const)0xC622D0129B0129F0ULL

Я использую ULL Суффикс указывает беззнаковый длинный длинный литерал.

Позволит ли мне это ядро ​​/ платформа / операционная система - это другой вопрос. Сначала я хочу узнать, правильный ли мой синтаксис.

Ответы [ 2 ]

12 голосов
/ 29 августа 2010

Ваш синтаксис почти правильный. Вам не нужен один из этих const:

const char* const p = (const char*)0xC622D0129B0129F0ULL

const непосредственно перед p указывает, что переменная p не может быть изменена после инициализации. Это не относится к тому, на что указывает p, поэтому вам не нужно это справа.

0 голосов
/ 29 августа 2010

В C. нет такой вещи, как адресный литерал.

Единственное, что гарантированно работает между целыми числами и указателями, это приведение от void* к uintptr_t (если оно существует) и затем обратно. Если вы получили адрес где-то в виде целого числа, он должен иметь тип uintptr_t. Используйте что-то вроде

(void*)(uintptr_t)UINTMAX_C(0xC622D0129B0129F0)

чтобы конвертировать обратно.

Вы должны включить stdint.h, чтобы получить тип uintptr_t и макрос UINTMAX_C.

...