C ++中的空指针算法11

时间:2016-04-20 14:48:28

标签: c++ c++11 pointer-arithmetic

我真的想使用一些void转换来保存二进制数据,但这可能是g ++警告级联或lot转换。有一种简单而安全的方法可以用C ++(最好是c ++ 11或更高版本)进行无效指针算术吗?

我只使用带有gnu编译器的posix系统,所以这里不是问题。

USECASE:

  • 我对*尺寸>的数据有空* ptr 1GB。

  • 我还有其他功能,让我们称之为stuff()它是外部库的一部分,并将(void *,size_t)称为params。

  • stuff(ptr,n)可能会改变底层内存。基本上我需要传递ptr *的片段。

代码假设,是,我猜,它不会是可移植的。

如果我不能找到更优雅的解决方案,我想我会选择-Wno-pointer-arithmetics,但是答案中提出的那个有帮助

1 个答案:

答案 0 :(得分:-4)

在询问arithemtics时,取决于你的想法。以下代码非常精细,可以通过GNU g ++ -std = c ++ 11编译:

#include <cstdlib>
#include <cstdio>

int main()
{
    void * x = std::malloc(100);
    std::printf("%p\n", x);
    std::printf("%p\n", x+20);
    return 0;
 }

(EDIT2) 问题很混乱,但如果gnu编译器可以工作,void指针算术完全可以。 GNU基本上将void *定义为具有一个字节增量的指针,并且上面代码中的所有语句都是正确的。我没有用其他编译器对它进行测试,只要考虑这个问题,我就没有。

对于GNU以外的编译器,使用无符号整数类型完全安全和正确:首先将指针强制转换为1byte整数类型之一:

  • 为size_t
  • uintptr_t / intptr_t
  • 或者如果你知道内存大小和模型 - 精确固定宽度整数}

如果内存寻址将被更改为每个单元格的任何其他奇怪的大小 - 您需要使用在向地址添加+1后将指向下一个物理存储单元格的类型。

另外澄清= bool不是1bit类型...它的填充(别名)字符,里面有一些包装魔法。