C++使用解引用操作符操作动态内存时访问异常问题咨询
问题原因分析
核心原因
你的问题出在第一个循环直接修改了foo指针本身的指向:
foo最开始指向你申请的3个int类型动态数组的首地址- 第一个循环每次执行
foo++,都会让foo向后偏移1个int的字节长度,循环执行3次退出后,foo已经指向了数组末尾之外的非法内存区域,不再持有原动态数组的首地址 - 第二个循环执行
*(foo+i)时,是基于已经偏移到非法位置的foo做地址计算,访问的根本不是你之前写入数据的内存区域,自然读不到正确值。
第二种写法正常的原因
当你用std::cin >> foo[i]替换原有写入逻辑时,全程都没有修改foo本身的指向,foo一直持有动态数组的首地址:
- 写入时的
foo[i]等价于*(foo + i),是基于首地址做偏移访问,不会改变foo本身的值 - 第二个循环的读取逻辑同样是基于原首地址做偏移,访问的是正确的内存地址,所以运行正常。
修复方案
如果你要保留指针自增的写入逻辑,不要直接操作原foo指针,可以引入临时指针遍历:
#include <iostream> int main() { int* foo; foo = new (std::nothrow) int[3]; // 新增临时指针用于遍历,不修改原foo的指向 int* p = foo; int temp; for (int i = 0; i != 3; i++) { std::cin >> temp; *p = temp; p++; } for (int i = 0; i != 3; i++) std::cout << *(foo+i) << std::endl; // 不要忘记释放动态申请的内存 delete[] foo; return 0; }
另外要注意:你原代码没有释放动态申请的数组,会造成内存泄漏,最终要加上delete[] foo释放资源。
内容的提问来源于stack exchange,提问作者meysamimani
相关产品推荐
相关产品推荐

