2010-08-29 3 views
5

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

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

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

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

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

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

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

+3

Ад адресного пространства. – GManNickG

+0

Это то, что раньше было AS/400. Ад вообще машины. –

ответ

12

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

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

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

+0

Компилятор, принимающий его, является хорошим местом для начала, но не гарантирует соответствия стандартам. В компиляторах реализовано множество расширений. Тем не менее, это выглядит правильно. –

+1

Нет, это неопределенное поведение. Предполагается, что только преобразование в 'void *' должно давать что-то правильное, а' uintptr_t' может отличаться от 'unsigned long long' (хотя и маловероятно в этом случае) –

+2

Jens ошибочен - поведение определено реализацией, * not * undefined – Christoph

0

Там нет такого понятия, как адрес буквального в С.

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

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

, чтобы преобразовать его обратно.

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

+0

-1: C99 определяет макросы для констант минимальной и максимальной ширины - макроса 'UINTPTR_C()' в 'stdint.h' – Christoph

+0

@Christoph: ваше второе утверждение верное. Я отредактирую свой ответ соответственно. –

+0

снят downvote; исправлено отсутствие «0x», а также ... – Christoph

Смежные вопросы