As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center提供指导。




已关闭8年。




在Visual Studio C++版本9(可能还有其他版本)中,以下代码:
int a = sizeof(void);
void const *b = static_cast<void const *>("hello world");
b += 6;

生成these errors:
error C2070: 'void': illegal sizeof operand
error C2036: 'const void *' : unknown size

该代码在GCC下工作,该代码处理 sizeof(void) as 1

解决此限制是否有办法,因为出于指针算术目的将其显式转换为char *会增加混乱(void *已被很好地识别并用作指向原始内存的无类型指针)。

更新0
  • 请注意,我非常了解
    标准的存在。
  • 希望做原始指针
    算术。
  • 我将sizeof(void)带到
    表明我很清楚这一事实
    那不是1
    问题的原因。
  • 代码
    这个例子只是为了说明
    需要生成错误。
  • 我知道这不是使用void的“正常”方法,但这是C语言,并且发生了这些事情。
  • 是的,人们需要在低级别进行此操作。我不追问为什么,我追问如何。如果您想知道为什么,请查看一些内核源代码或友好的glibc。

  • 更新1

    看来这个问题引起了很大的混乱。问题不是关于为什么不使用sizeof(void) == 1并不是标准的问题,而是关于不这样做的情况。

    在要执行单字节指针算术的情况下,事实证明强制转换为char *是正确的答案,这不是因为*(void *)没有大小,而是因为该标准实际上保证*(char *)始终是1。因此,char *的使用始终是正确的,并且出于原始指针算法的目的,它与带有GCC扩展名的void *一致。

    为了进一步强调这一点,void *是指向无类型内存的指针的正确选择,char *是将原始指针算法强制转换为的正确类型。

    最佳答案

    从技术上讲,增加指针的大小应该使指针指向的东西大小增加。空隙指向无物,因此大小未知。

    对于某些编译器来说,让您增加void指针是一件很不错的事情。

    强制转换很烦人,因为您必须将其强制转换为另一个指针,然后再返回,或执行一些麻烦的操作,例如(*(char *)&voidptr) += 6
    就个人而言,出于算术目的,我只是将其声明为char *

    07-24 09:46
    查看更多