为什么C++实现幂值数组时第4个元素之后输出全为0?
问题原因
- 非法使用变长数组+数组定义时长度未初始化:C++标准不支持用运行时变量
power作为栈数组的长度,且你定义powarray时power还未输入、属于未初始化的垃圾值,数组长度完全不确定,属于未定义行为,这是长度≥5时输出异常的核心原因之一。 - 数组越界访问+未初始化首元素:循环从
n=0开始,第一次执行计算时就访问了powarray[n-1]也就是powarray[-1],访问了数组外的非法内存,且你注释掉了首元素的初始化逻辑,所有数组元素初始都是栈上的垃圾值,长度≤4时刚好读到的内存值碰巧符合预期,长度变大后内存访问异常就显现出来了。 - 数组类型不匹配:
powarray定义为int类型,底数base是double,幂运算结果可能溢出int范围或丢失精度。 - 变量未初始化直接使用:
power定义时未赋值就直接进入while(power >= 0)的判断,初始值是随机垃圾值,可能导致循环首次判断逻辑异常。
修复方案
修改后的可正常运行代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int power = 0; double base; while(power >= 0) { cout << "Please enter a base number.\n"; cin >> base; cout << "Please enter your exponent.\n"; cin >> power; if (power <= 0) { cout << "Please enter a nonnzero power\n"; } else { // 用C++标准容器vector实现动态长度数组 vector<double> powarray(power); // 初始化首元素 powarray[0] = base; cout << powarray[0] << endl; // 循环从1开始避免越界 for(int n = 1; n < power; n++) { powarray[n] = base * powarray[n-1]; cout << powarray[n] << endl; } } } return 0; }
修改点说明:
- 用C++标准容器
vector<double>替代非法的变长数组,确保动态长度的数组可以安全使用,同时用double类型匹配base的浮点类型,避免精度丢失。 - 把数组的定义移动到
power输入之后,确保数组长度是确定的有效值。 - 补全首元素初始化逻辑,循环从索引1开始遍历,完全避免数组越界访问。
- 给
power变量设置初始值0,避免未初始化变量参与判断的未定义行为。
内容的提问来源于stack exchange,提问作者siennar_04
相关产品推荐
相关产品推荐

