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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:18:00