c++ - C ++将4个字节添加到指针地址
问题描述
我有一个关于指针和内存地址的问题:
假设我有以下代码:
int * array = (int *) malloc(sizeof(int) * 4);
现在在存储内存地址的数组中,我知道 C++ 在向该指针添加 +1 时已经小心,它将添加 4 个字节,但是如果我想手动添加 4 个字节怎么办?
array + 0x004
如果我正确,这将导致添加 4*4 (16) 个字节,但我的想法是手动添加这 4 个字节。
为什么?只是在玩,我试过这个,我得到了与我预期完全不同的结果,然后我研究了,我发现当你向指针添加 +1 时,c++ 已经很小心了(它总计 4 个字节这个案例)。
任何想法?
解决方案
对于指向具有 valuep
的类型的指针,表达式将(无论如何在大多数系统上)导致指向 address 的指针。要获得指针的固定字节偏移量,您可以首先将其转换为字符指针,如下所示:T
v
p+n
v+n*sizeof(T)
reinterpret_cast<T*>(reinterpret_cast<char*>(p) + n)
在 c++ 中,sizeof(char)
定义为等于 1。
请注意,访问不正确对齐的值可能会产生很大的性能损失。
另一件需要注意的事情是,一般来说,不允许将指针转换为不同类型(称为严格别名char*
规则),但是显式地将任何指针类型转换为和返回异常。
推荐阅读
- arrays - 如何提高以下程序的速度?
- yocto - 我无法将 flatc 安装到基于 yocto 的 SDK 中
- python - tensorflow-model-analysis 0.13.2 和 0.13.1 版不在 python2 中运行
- android - 如何从 Datasnapshot 中获取图像的 URI
- java - java - 如何在Java Spring中的不同请求中使用相同的SET实例
- ansible - Ansible:使用循环变量的序列范围
- javascript - fb.init fb 未定义
- r - R:不识别新表中的列
- docker - docker swarm 服务,将 args 传递给 swarm 中的单个副本
- firebase - 来自 Microsoft Azure 的 Firebase signInWithCredentials