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

C++输入数组后0号元素变为数组长度问题排查及解决

问题成因
  • C++ 标准不支持长度为0的栈上数组,你代码中int array[] = {};属于非标准的编译器扩展,实际不会为数组分配任何可安全写入的内存空间。
  • 你调用getArray向array[i]写入元素时,所有操作都属于栈内存越界访问,触发未定义行为。你观测到的0号元素等于数组长度的现象,是因为栈上array的首地址刚好和存储len变量的栈地址重叠,读取array[0]时实际读取的是len的存储值。
修复方案

推荐两种安全实现方式:

方案1:使用C++标准库vector容器(推荐)

vector会自动管理内存,无需手动指定初始大小,是C++中处理动态长度序列的首选方案。
修复后代码如下:

#include<iostream>
#include<vector>
using namespace std;

int getArray(vector<int>& array)
{
  int len;
  cout << "Enter the length of the array" << endl;
  cin >> len;
  array.resize(len); // 调整vector大小适配输入长度
  cout << "Enter the elements in the array" << endl;
  for (int i = 0; i < len; ++i)
  {
    cin >> array[i];
  }
  return len;
}

void printArray(const vector<int>& array, int len)
{
  for (int i = 0; i < len; i++)
  {
    cout << array[i] << " ";
  }
}

int main(int argc, char const *argv[])
{
  vector<int> array;
  int len = getArray(array);
  printArray(array, len);
  return 0;
}

方案2:使用动态分配数组

如果必须用原生数组实现,需要先读取长度,再动态分配对应大小的数组内存,使用结束后手动释放避免内存泄漏。
修复后代码如下:

#include<iostream>
using namespace std;

int getArray(int*& array) // 传入指针的引用,用来接收新分配的数组地址
{
  int len;
  cout << "Enter the length of the array" << endl;
  cin >> len;
  array = new int[len]; // 动态分配对应长度的数组
  cout << "Enter the elements in the array" << endl;
  for (int i = 0; i < len; ++i)
  {
    cin >> array[i];
  }
  return len;
}

void printArray(const int array[], int len)
{
  for (int i = 0; i < len; i++)
  {
    cout << array[i] << " ";
  }
}

int main(int argc, char const *argv[])
{
  int* array = nullptr;
  int len = getArray(array);
  printArray(array, len);
  delete[] array; // 手动释放动态分配的数组内存
  return 0;
}

内容的提问来源于stack exchange,提问作者Anand S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:06:03