linux - gcc中的大尺寸指针

标签 linux pointers gcc 32bit-64bit gcc4

我想在 gcc 中定义一个不依赖于平台的大尺寸指针(64 位或 128 位)。 我认为 MSDN 中有类似 __ptr128 或 __ptr64 的内容。

sizeof(__ptr128) is 16 bytes.
sizeof(__ptr64 ) is 8  bytes.

这可能吗?

当您在需要 8 字节指针参数的 64 位操作系统中使用内核函数并且您有一个使用 32 位地址的 32 位应用程序并且您想使用此内核函数时,它会很有用。

最佳答案

你的问题毫无意义。根据定义,指针是指向某物的内存地址——大小必须取决于平台。您将如何在支持 64 位寻址的硬件平台上取消引用 128 位指针?!

您可以创建 64 位或 128 位,但指针与底层硬件的内存寻址方案直接相关。

编辑

通过您的附加声明,我想我明白您要做什么了。不幸的是,我怀疑这是可能的。如果您要使用的内核函数采用 64 位指针参数,则它很可能是 64 位函数(除非您正在为某些不寻常的硬件开发)。

尽管技术上可以将 64 位指令混合到 32 位可执行文件中,但实际上没有编译器允许您这样做。 64 位 API 调用将使用 64 位代码、64 位寄存器和 64 位堆栈 - 编译器和操作系统管理从 32 位环境到 64 位环境的任意切换将非常尴尬环境。

您应该寻找适用于 32 位环境的等效 API。也许您可以发布您要使用的内核函数原型(prototype)(名称+参数),有人可以帮助您找到更好的解决方案。

只是为了避免混淆,MSDN 中的__ptr64平台独立的:

On a 32-bit system, a pointer declared with __ptr64 is truncated to a 32-bit pointer.

关于linux - gcc中的大尺寸指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9262280/

相关文章:

Linux。 SOL_NETLINK 未定义

pointers - 为什么我得到无效的内存地址或nil指针取消引用?

c - 使用指针在结构中输入

在函数内部更改指针不会反射(reflect)在函数外部

c++ - Cygwin g++ 编译失败

linux - vim 中 setpos 和 getpos 的奇怪行为

php - Derby 安 9 : the php5 packages is not installed

linux - --data 选项如何在 curl 中工作

c++ - 将 VS 移植到 linux : no matching function for call to

c - 为什么 C 编译器不捕获此错误?