为什么将指针铸成数字类型是不安全的
Why it is not safe casting a pointer to a numeric type?
考虑此代码
T* pa = new T(13);
int address = reinterpret_cast<int>(pa);
t可以是任何内置类型。
1)我不明白在此处重新诠释的重新解释是什么?
2)这种铸造会导致不确定行为的情况如何?
3)pa
将始终包含内存地址的正确十进制表示?
我不明白在此处重新诠释的重新解释是什么?
因为标准不需要int
S和指针具有相同的大小,因此您可能会通过铸造丢失信息。
这种铸造会导致不确定行为的情况如何?
这是真的:
1 << (sizeof(T*) * CHAR_BIT) > INT_MAX
那么,地址的值可能无法填充int
,它调用了未定义的行为。
pa
将始终包含内存地址的正确小数表示?
如果您使用std :: [u] intptr_t,那么是的,因为这些类型可以保证能够保持指针的值。
T*
和int
的大小取决于您的编译器和架构。
如果sizeof(T*) > sizeof(int)
您会丢弃信息。虽然在一个编译器上可能是正确的,并且在另一个编译器上可能不正确。
您可以使用std::intptr_t
或std::uintptr_t
而不是int
。这两个保证足够大以保持指针的价值。
正如其他答案所指出的那样,整数的大小和指针的大小不必相同。例如,在许多64位Intel机器上,指针为64位,整数仅为32。
。不过,还有其他原因也可以防止这种情况。例如,某些较旧的处理器体系结构具有整数表示,其中包括陷阱表示,如果使用的话会导致不确定的行为。这意味着,原则上,指针可以适合整数的大小,但是施放指针指向整数可能会导致陷阱表示,从而导致进一步的数字计算失败。
相关文章:
- 提升错误:变量"TimeSpec RQTP"具有初始值设定项,但类型不完整
- 'HMAC_CTX'类型不完整
- 使用wchar_t更改字符的类型不像L
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- 问:Apache Arrow 数组生成器不安全追加
- 不安全的 MPI 非阻塞通信示例?
- C++ 聚合的类型不完整,无法使用模板类定义
- 类型不可知的抽象以使用相同的运行时接口处理正向和反向迭代器和范围?
- 成员引用基类型不是结构或联合
- 重载函数的地址与所需类型不匹配
- 有没有一种简单的方法来检查C++中的不安全表达式
- 内建数组出现不允许的类型不完整错误
- QDate 的类型不完整,声明为私有成员
- 参数错误可能与类型不匹配有关?
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 为什么将指针铸成数字类型是不安全的
- 为什么C宏的类型不安全
- 将较小的整数类型赋值给较大的整数类型是否不安全?