【问题标题】:Is it safe and portable to cast pointer to any type to char pointer for arithmetic? [closed]将指向任何类型的指针转​​换为用于算术的 char 指针是否安全且可移植? [关闭]
【发布时间】:2020-12-22 20:06:29
【问题描述】:

考虑以下 sn-p,对于 C 和 C++ 语言,是:

int t[2] = { 0, 1 };
*( (int *)( (char *)t + sizeof(int) ) ) = 2;

总是等价于:

int t[2] = { 0, 1 };
t[1] = 2;

?

这听起来可能很奇怪,但我想出了一些在某些平台上可能是错误的原因:

  1. char 指针增量可能与int 指针相反,除非它未经标准授权(在这种情况下,我想找到标准规定的位置)

  2. int *char * 的转换可能是不安全的,因为不能保证它们的大小相同(在这种情况下,它可以与void * 的中间转换一起使用吗?),并且因为标准不保证先转换为 char * 然后再转换为指向任何类型的指针是安全的

【问题讨论】:

  • C 和 C++ 是不同的语言。值得注意的是,C++ 对指针算术和对象生存期有更严格的规则,因此两种语言的答案可能会有所不同。您应该指定您实际询问的语言。
  • @FlashMcQueen 是的。如果不允许这样做,那不是因为不同类型的数组在不同的方向上增长。
  • 请选择一种语言。这个问题很有趣,但如果同时包含两种语言,就会变得有点宽泛
  • @FlashMcQueen “在这种情况下,我很想学习这两种语言”可能是真的,但现在你需要一个需要 2 种语言的主题。这样,您就更有可能获得 OK 2 种语言的答案,而不是 1 种 专家 级别的答案。如果第一个问题不满足,最好发布第二个问题。
  • 你不能实现memcpymalloc等,如果指针算术根据类型走向不同的方向,那么它们都可以使用空指针。

标签: c++ arrays c pointers pointer-arithmetic


【解决方案1】:

将指向任何类型的指针转​​换为用于算术的 char 指针是否安全且可移植?

任何类型 --> 否。

(非空)函数指针转换为 char * 是 UB,然后应用的数学是 UB。

char * 甚至可能太小而无法编码函数指针。

【讨论】:

  • 也许添加“yes” - 对于任何对象类型?
  • @EugeneSh。也许对于对象类型,但 OP 正在询问关于任何类型和 2 种语言的广泛问题。 OP 不提供总体目标,因此有一般性问题、一般性答案。
  • @chux-ReinstateMonica 嗯,任意函数指针数组是否有效,严格符合 C 代码?还是只有完全相同类型的函数指针?
  • @AndrewHenle 在“任意函数指针数组”中,数组元素的地址是指向函数指针的指针,所以我们回到 object 指针数学。注意 - 函数指针的大小都相同 - 尽管可能与一些/所有 object 指针不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2018-06-08
  • 1970-01-01
  • 2013-06-03
  • 2016-06-02
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多