【问题标题】:Casting between SIZE_T and void* on WindowsWindows 上 SIZE_T 和 void* 之间的转换
【发布时间】:2014-05-18 07:42:00
【问题描述】:

我已经阅读了关于 stackoverflow 的几篇文章,例如 size_t vs. uintptr_tIs sizeof(size_t) == sizeof(void*) always true?,并且了解到根据 C++ 标准,SIZE_T 和 void* 的大小可以不同,以考虑诸如 16 位分段架构之类的架构。

所以我想将我的场景的平台限制为 Windows,无论是 x86、x64、WoA(Arm 上的 Windows):在 Windows 上,如果我 malloc 创建一个 void* 类型的指针,我想要在将指针传递给 memcpy 或其他东西之前做指针算术,我必须这样做:

void* p = malloc(100);
memcpy(reinterpret_cast<void*>((reinterpret_cast<SIZE_T>(p) + offset), p2, 100);

这看起来很乏味,特别是如果您必须在任何地方来回乱扔这种类型的铸造(我正在使用各种偏移量)。鉴于这是在 Windows 平台上,我想知道是否可以进行一些简化来减少这种类型的样板代码?

谢谢。

【问题讨论】:

  • 理想情况下,首先创建正确的类型。否则,请使用 char * 进行演员表进行算术运算。这将始终有效(只要您注意对齐等,可以将其转换回您需要的任何类型)。
  • 在 C++ 中,几乎所有问题都有比 void *mallocmemcpy 更好的选择
  • 对于除 0 以外的任何 offset 值看起来都非常不安全。您的意思是 memcpy(...,100-offset) 吗?
  • 现在是使用内联模板函数的绝佳时机,也可以使用不太理想的宏。

标签: c++ windows size-t


【解决方案1】:

将其转换为 unsigned char * 并使用它进行指针运算。

【讨论】:

  • 嗯......我想知道这个答案和@Matt McNabb 的有什么区别(这个得到 6 个赞成票,另一个得到 1 个反对票)......
  • @barakmanos:不知道为什么 Matt 被否决了,但我的帖子是最先发布的,所以这可能就是它被投了赞成票的原因......
  • @barakmanos:嗯,我通常认为unsigned 类型更适合这种情况(因为定义了它们的溢出行为),但我通常只是超级偏执。我认为在这种情况下它实际上并没有什么不同。一般来说,虽然unsigned 不太容易出错。
  • 明白了,谢谢...关于投票系统的可靠性,这里有一个额外的(不相关的)见解:)
  • @barakmanos:是的。另外顺便说一句,我在心理上将 signed charunsigned char 视为 integer 类型,而我将 charwchar_t 视为 character 类型......在这种情况下不涉及字符串,因此涉及char 意义不大,可能会误导读者认为内存包含字符串。
【解决方案2】:

根据您的描述,我认为您只是想要:

memcpy( (char *)p + offset, p2, 100);

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2020-05-06
    • 2012-07-26
    • 2014-09-05
    • 2011-05-27
    相关资源
    最近更新 更多