我真的想使用一些void转换来保存二进制数据,但这可能是g ++警告级联或lot
转换。有一种简单而安全的方法可以用C ++(最好是c ++ 11或更高版本)进行无效指针算术吗?
我只使用带有gnu编译器的posix系统,所以这里不是问题。
USECASE:
我对*尺寸>的数据有空* ptr 1GB。
我还有其他功能,让我们称之为stuff()
它是外部库的一部分,并将(void *,size_t)称为params。
stuff(ptr,n)可能会改变底层内存。基本上我需要传递ptr *的片段。
代码假设,是,我猜,它不会是可移植的。
如果我不能找到更优雅的解决方案,我想我会选择-Wno-pointer-arithmetics,但是答案中提出的那个有帮助
答案 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整数类型之一:
如果内存寻址将被更改为每个单元格的任何其他奇怪的大小 - 您需要使用在向地址添加+1后将指向下一个物理存储单元格的类型。
另外澄清= bool不是1bit类型...它的填充(别名)字符,里面有一些包装魔法。