You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:57:04