void 大小未知时的指针算术 [关闭]

2023-12-26

在 Visual Studio C++ 版本 9(可能还有其他版本)中,以下代码:

int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;

生成these http://msdn.microsoft.com/en-us/library/9adz64y0.aspx errors http://msdn.microsoft.com/en-us/library/1kay26wa%28VS.80%29.aspx:

error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size

该代码在 GCC 下运行,它处理sizeof(void) as 1 http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Pointer-Arith.html#Pointer-Arith.

是否有某种方法可以解决此限制,例如显式转换为char *出于指针算术的目的增加了混乱(void *被广泛认可并用作指向原始内存的无类型指针)。

Update0

  • 请注意,我很清楚 标准的存在。
  • I want做原始指针 算术。
  • I take sizeof(void)到 表明我很清楚这个事实 事实并非如此1是个 问题的原因。
  • 代码 例子只是为了证明什么 需要生成错误。
  • 我知道这不是“正常”的使用方式void,但这是 C,这些事情就会发生。
  • 是的,人们需要在低水平上做到这一点。我不追求为什么,我追求如何。如果你想知道为什么,请查看一些内核源代码,或者你友好的 glibc。

Update1

看来这个问题引起了很大的混乱。问题不在于why having sizeof(void) == 1不是标准的,但是当不标准时该怎么办。

在要完成单字节指针算术的实例中,事实证明,强制转换为char *是正确答案,不是因为*(void *)没有尺寸,但因为标准实际上保证了*(char *)总是1。因此使用char *总是正确的,并且与void *与 GCC 扩展一起用于原始指针算术。

为了进一步强调这一点,void *是指向无类型内存的指针的正确选择,并且char *是正确的类型用于原始指针算术.


从技术上讲,增加指针应该是增加它所指向的对象的大小。虚空指的是虚无,所以大小未知。

对于某些编译器来说,让您增加 void 指针是一件好事。

强制转换很烦人,因为您必须将其强制转换为另一个指针,然后再返回,或者做一些尴尬的事情,例如(*(char *)&voidptr) += 6

就我个人而言,我只是将其声明为char *出于算术目的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

void 大小未知时的指针算术 [关闭] 的相关文章

随机推荐