【问题标题】:Increment void pointer by one byte? by two?将 void 指针增加一个字节?两个?
【发布时间】:2011-09-20 22:51:16
【问题描述】:

我有一个名为ptr 的空指针。我想将此值增加多个字节。有没有办法做到这一点?

请注意,我想在没有创建任何变量的情况下在不创造的情况下进行。

我可以做类似ptr = (void *)(++((char *) ptr)); 的事情吗?

【问题讨论】:

    标签: c++ c pointers


    【解决方案1】:

    您不能对 void 指针执行算术运算,因为指针算术是根据指向对象的大小定义的。

    但是,您可以将指针转换为 char*,对该指针进行算术运算,然后将其转换回 void*

    void* p = /* get a pointer somehow */;
    
    // In C++:
    p = static_cast<char*>(p) + 1;
    
    // In C:
    p = (char*)p + 1;
    

    【讨论】:

    • 不应该是 reinterpret_cast 吗?
    • @Balk: static_cast 就足够了。
    • 使用此答案中的方法将MyStruct* 转换为char* 时出现invalid type conversion 错误。是否缺少某些上下文?
    • @TomášZato-ReinstateMonica - 是的:您没有将void* 转换为任何其他指针类型(可以静态完成),而是MyStruct* - 请参阅here
    【解决方案2】:

    不能对void 指针进行算术运算。

    编译器不知道void 指针指向的项目的大小。您可以将指针投射到 (char *) 以执行此操作。

    在 gcc 中有一个扩展将 void 的大小视为 1。所以可以在void* 上使用算术来添加字节偏移量,但使用它会产生不可移植的代码。

    【讨论】:

    • 在 GCC 中这是可能的,因为 sizeof(void) 产生 1
    • @Blagovest Buyukliev:它是 GCC 中的扩展,它将 void 的大小视为 1,使用它会产生不可移植的代码。
    • @Blag:与往常一样,请使用-pedantic 进行编译。 :)
    【解决方案3】:

    只是增加void* 确实在 gcc 中起作用:

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() {
        int i[] = { 23, 42 };
        void* a = &i;
        void* b = a + 4;
        printf("%i\n", *((int*)b));
        return 0;
    }
    

    但它在概念上(和官方上)是错误的,所以您想明确说明:将其转换为 char* 然后返回。

    void* a = get_me_a_pointer();
    void* b = (void*)((char*)a + some_number);
    

    这表明你增加了字节数。

    【讨论】:

    • 一如既往,请使用-pedantic进行编译。 :) 这是 GCC 的不合格扩展。
    【解决方案4】:

    你可以这样做:

    ++(*((char **)(&ptr)));
    

    【讨论】:

    • 是的,但为什么你呢?那是可怕的晦涩代码,无缘无故地使解析它正在做的事情变得不必要地困难。此外,在 C++ 中不鼓励 C 风格的强制转换,但这是这里最不重要的问题。
    • 你也可以把一根燃烧的棍子塞进你的眼睛。可能比看++(*((char **)(&amp;ptr))); 伤害小。
    • 他想在不创建任何变量的情况下就地执行此操作,所以我给出了这个解决方案。您可以将其视为一种指导方式,但绝对不能在您的代码中使用它。
    猜你喜欢
    • 2013-04-26
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2013-05-10
    • 2012-11-04
    • 2015-10-09
    相关资源
    最近更新 更多