gpt4 book ai didi

c - void 大小未知时的指针运算

转载 作者:行者123 更新时间:2023-12-02 05:21:22 28 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




9年前关闭。




在 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 *总是正确的,并且与 void * 一致带有 GCC 扩展,用于原始指针算术。

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

    最佳答案

    增加一个指针在技术上应该是增加它指向的任何大小的东西。 Void 不指向任何东西,所以大小未知。

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

    强制转换很烦人,因为您必须将其强制转换为另一个指针,然后返回,或者执行诸如 (*(char *)&voidptr) += 6 之类的尴尬事。

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

    关于c - void 大小未知时的指针运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864352/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com