- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 intptr_t
作为通用存储(保存指针和整数值)而不是 void*
是个好主意吗? (如此处所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)
对于我已经阅读的内容:
int
-> void*
-> int
往返不保证保持原始值;我想 int
-> intptr_t
-> int
会做void*
和 intptr_t
上的指针算术都需要强制转换,因此这里没有优势void*
表示在存储指针时较少显式转换,intptr_t
表示在存储整数值时较少转换intptr_t
需要 C99我还应该考虑什么?
最佳答案
Is it a good idea to use
intptr_t
as a general-purpose storage (to hold pointers and integer values) instead ofvoid*
?
没有。
intptr_t
不保证存在。首先,正如您所注意到的,它是在 C99 中引入的。其次,实现不需要具有足够大的整数类型来保存转换后的指针值而不丢失信息。
将 int
转换为 intptr_t
并返回 不太可能 丢失信息,但没有实际保证 intptr_t
比 int
更宽。
如果要存储指针值,请将它们存储在指针对象中。这就是指针对象的用途。
任何指向对象或不完整类型的指针都可以转换为 void*
并在不丢失信息的情况下再次返回。对于指向函数的指针没有这样的保证——但是任何指向函数的指针类型都可以转换为任何其他指向函数的指针类型并返回而不会丢失信息。 (我指的是 C 标准;我认为 POSIX 提供了一些额外的保证。)
如果您想在同一个对象中存储一个整数或一个指针值,您应该做的第一件事就是重新考虑您的设计。如果您已经这样做,并且得出结论认为您确实想要这样做,请考虑使用 union (并仔细跟踪您最近存储的值类型)。
有些 API 使用 void*
参数来允许传递任意数据;例如,参见 POSIX pthread_create()
功能。这可以通过将整数值转换为 void*
来滥用,但传递整数对象的地址会更安全。
关于c - 使用 intptr_t 而不是 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492798/
我正在尝试使用 _Generic 制作线程安全的 strerror 函数,该函数与使用 strerror_r 的 XSI 或 GNU 变体无关. XSI 变体返回一个 int 并修改传递给它的缓冲区的
问题:有没有办法在 C++ 中将指向成员函数的指针转换为 intptr_t? 已知因素: 我知道成员函数指针很特别 我知道成员函数传递隐藏的“this”参数 (__thiscall)。 我知道 siz
我知道它是一个整数类型,可以在不丢失数据的情况下与指针进行转换,但我为什么要这样做呢?与 void* 用于保存指针和 THE_REAL_TYPE* 用于指针算术相比,整数类型有什么优势? 编辑 标
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Easiest way to convert int to string in C++ 有人知道如何进行转换
假设我想将一个 void* 指针移动 4 个字节。是以下等价物: 答: void* new_address(void* in_ptr) { intptr_t tmp = (intptr_t)i
我需要将任意指针转换为数值,以便通过哈希函数传递它。 理想情况下,只是为了好玩,我还希望数字可以转换回同一个指针。但这不是必须的。 在浏览了 SO 和互联网之后,我不清楚 uintptr_t 或 in
我正在尝试在 swift 项目中使用 libmpv。我把所有东西都联系起来了,我正在努力遵循基本的 example . 问题是,要显示视频,我必须将整数指针 (intptr_t) 传递给 wid co
在 ctypes 中我有 TBButton.ptr(ctypes.UInt64("0x1e677e60") 这相当于 aButton.address()在这行代码中: var rez = SendMe
C++(C++11,如果它有所不同)中是否有一个函数可以将字符串转换为 uintptr_t 或 intptr_t?我总是可以使用 atoll() 并在之后转换它,但最好是获得一个函数,该函数对 32
阿法克 uintptr_t intptr_t 可用于保存指向 void 的任何指针。因此,这些类型可用于存储指向数据的指针。 在 C99 或更高版本中,是否有类似的有符号和无符号整数类型能够保存指向函
考虑到我需要将“通用”指针的值存储在结构中并且对指向的内存本身不感兴趣,我发现将其存储为 intptr_t 在此类机器上是否有意义) 关于c - 什么时候 uintptr_t 优于 intptr_t?
使用 intptr_t 作为通用存储(保存指针和整数值)而不是 void* 是个好主意吗? (如此处所示:http://www.crystalspace3d.org/docs/online/manua
intptr_t 和 uintptr_t 的字符串格式是什么,对 32 位和 64 位架构都有效。 编辑 warning: format ‘%x’ expects type ‘unsigned int
我似乎无法理解当我尝试将 void * 值分配给 intptr_t 变量时收到的 GCC 编译器警告。具体来说,当我使用 -std=c99 -pedantic 进行编译时,我收到以下有关第 7 行变量
我可以拿一个 intptr_t并将其分配或 memcpy 到 uintptr_t并再次返回并保证以相同的值结束? 也就是说,以下任何一项都可以保证工作(无断言): 使用赋值: intptr_t i1
更具体地说,如果我有以下函数指针类型: typedef void (*callback_type) (intptr_t context, void* buffer, size_t count); 我可
我正在为 add_signed MPL 类开发一些测试,将类型转换为其已签名的对应项。定义如下: template struct add_signed { typedef T type; };
我正在阅读一些关于 c++11 的资料,我注意到一些关于 int 类型名称的事情。现在,显然该规范只能通过付费获得,但有一份 2 月份的早期草案可在 http://www.open-std.org/j
我在 MinGW 中编译 C 程序时收到此错误。据我所知,我认为“intptr_t”是 C99 标准中的一种类型。我没有包含文件吗? 最佳答案 您需要包含 stdint.h。 请注意,intptr_t
什么时候应该使用 intptr_t 和 size_t 数据类型? 在 32 位平台上,intptr_t 和 size_t 都设置为 32 位。在 64 位平台上,它们被设置为 64 位。有使用指南吗?
我是一名优秀的程序员,十分优秀!