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
相关产品推荐
相关产品推荐

