如何在C++中读取数组并通过指针返回,输出乱码如何解决
问题原因
- 你的
readArray函数仅返回了动态数组的首地址,没有将数组长度同步传递给调用方,main函数无法感知数组的有效元素边界。 - 你在
main中使用while(*p !=-1)作为循环终止条件,但构造数组时没有在末尾插入-1作为哨兵结束标记,导致循环触发堆内存越界访问,后续输出的乱码都是堆内存中未初始化的随机值,属于C++标准规定的未定义行为。
修复方案
方案1:同步返回数组长度(更稳妥,无前置限制)
将数组指针和长度绑定返回,循环时按照实际长度输出即可,代码示例:
#include<iostream> #include<utility> using namespace std; pair<int*, int> readArray() { int n; cin>>n; int *arr = new int[n]; for (int i=0;i<n;i++){ cin>>arr[i]; } return {arr, n}; } int main() { auto res = readArray(); int *p = res.first; int len = res.second; for (int i=0;i<len;i++) { cout<<p[i]<<" "; } delete[] p; return 0; }
方案2:添加哨兵结束标记
如果要保留原有的哨兵判断逻辑,需要多申请1位数组空间存储-1结束标记,该方案的限制是数组有效元素中不能出现-1,否则会提前终止输出,代码示例:
#include<iostream> using namespace std; int* readArray() { int n; cin>>n; int *arr = new int[n+1]; // 多开1位存储哨兵 for (int i=0;i<n;i++){ cin>>arr[i]; } arr[n] = -1; // 手动添加结束标记 return arr; } int main() { int *p= readArray(); int *q = p; while(*p !=-1) { cout<<*p<<" "; p = p + 1; } delete[] q; return 0; }
内容的提问来源于stack exchange,提问作者Thịnh Thông Thái
相关产品推荐
相关产品推荐

