内存地址字面量

6
给定一个十六进制格式的字面内存地址,我该如何在C语言中创建一个指针来寻址这个内存位置?
我的平台(IBM iSeries)上的内存地址是128位。C类型long long也是128位。
假设我有一个指向字符串(char数组)的内存地址为:C622D0129B0129F0 我认为直接寻址这个内存位置的正确C语法为: const char* const p = (const char* const)0xC622D0129B0129F0ULL 我使用ULL后缀表示无符号长整型字面量。
是否允许我这样做取决于我的内核/平台/操作系统,这是另一个问题。我首先想知道我的语法是否正确。

1
这就是曾经的AS/400,通常是一台非常强大的机器。 - Tom Anderson
2个回答

12

你的语法几乎正确。你不需要其中一个const

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

const 关键字紧跟在 p 变量之前,表示这个变量在初始化后不能被修改。它并没有涉及到 p 所指向的对象,因此你不需要在右侧使用 const


编译器接受它是一个好的起点,但并不保证符合标准。编译器实现了许多扩展。话虽如此,是的,这看起来是正确的。 - Merlyn Morgan-Graham
1
不,这是未定义的行为。只有转换为 void* 才应该得到正确的结果,而 uintptr_t 可能与 unsigned long long 不同(尽管在这种情况下不太可能)。 - Jens Gustedt
2
Jens错了 - 行为是实现定义的,不是未定义的。 - Christoph

2

C语言中不存在地址字面量这样的东西。

唯一保证在整数和指针之间能正常工作的是从void*uintptr_t(如果存在)的强制类型转换,然后再返回。如果您通过某种途径获得了一个整数地址,那么它应该属于uintptr_t类型。可以使用类似以下方式:

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

将其转换回去。

您需要包含stdint.h以获取类型uintptr_t和宏UINTMAX_C


-1:C99仅为最小宽度和最大宽度整数常量定义宏 - 在stdint.h中没有宏UINTPTR_C() - Christoph
@Christoph:你的第二个断言是正确的。我会相应地编辑我的答案。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接