指针如何判断堆内存末尾?如何用解引用与自增操作初始化堆数组?
C++指针操作问题解答
1. 指针判断堆内存块末尾的方法
原生裸指针本身不携带所指向内存块的长度信息,C++标准也没有提供通过裸指针直接获取动态分配内存块大小的接口,因此无法仅通过指针自身判断是否到达堆内存块末尾。
常见的解决方案有两种:
- 自行存储动态分配内存块的长度,遍历的时候通过已移动步数和总长度对比判断是否到达末尾
- 放弃使用裸指针管理动态数组,改用
std::vector等标准库容器,容器自身会维护长度信息,可直接调用size()方法获取长度,也可通过begin()、end()获取迭代器做遍历
2. 指针自增+解引用的赋值、遍历实现
错误写法原因说明
你给出的示例代码确实是错误的:new int[5]分配的数组默认是未初始化状态,内存中存储的是随机垃圾值,*p != 0的判断条件没有任何逻辑依据,大概率会出现提前终止循环或者数组越界访问的问题,属于未定义行为。
正确实现思路
核心原则:不要修改指向内存块起始地址的原始指针,避免出现内存泄漏、无法回到起始位置的问题,建议用额外的临时指针做移动操作,同时预先计算好尾后指针作为循环终止条件。
完整实现代码如下:
#include <iostream> int main() { const int arr_len = 5; int* p = new int[arr_len]; // 预先计算尾后指针,作为循环终止边界 int* end = p + arr_len; // 用临时指针curr做移动操作,不修改原始指针p int* curr = p; int val = 5; // 赋值操作 for (; curr != end; ++curr) { *curr = ++val; } // 重置临时指针到起始位置,做遍历输出 curr = p; for (; curr != end; ++curr) { std::cout << *curr << " "; } // 最后释放堆内存,必须用原始起始指针 delete[] p; return 0; }
补充说明
如果你一定要修改原始指针做操作,需要准确记录移动的步数,赋值完成后再减对应步数回到起始位置,但这种写法出错概率极高,非常不推荐。实际开发中优先使用std::vector容器,完全不需要手动管理指针和内存,也能避免绝大部分指针操作相关的问题。
内容的提问来源于stack exchange,提问作者Adeniran Adeniyi
相关产品推荐
相关产品推荐

