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

C++动态数组出现意外输出的原因咨询:为何返回随机内存地址而非预期值

问题根源分析:全局变量初始化与数组越界的未定义行为

嘿,我来帮你拆解下这个问题的根源——你的代码里有两个关键问题导致了随机值输出,都是C++里容易踩的坑:

1. 全局变量index的默认初始化坑

你定义的unsigned long index是全局变量,在C++里全局变量会被默认初始化为0。这直接导致第一次调用test.Set()时出问题:

  • new T[index]等价于new int[0],这会返回一个合法但不能解引用的指针(因为数组长度为0,没有可访问的元素)
  • 循环for (unsigned int i = 0; i < index; i++)因为index=0,循环体根本不会执行,数组里没有任何赋值操作
  • 之后index++让index变成1
  • 这时候你访问test.value_[0],本质是对长度为0的数组做越界访问——这属于C++里的未定义行为,程序会读取内存里的随机垃圾值,所以第一次输出是随机数

2. 第二次调用Set()的越界问题

当你第二次调用test.Set()时,index的值已经是1了:

  • new T[index]创建了一个长度为1的int数组,循环给target[0]赋值为0
  • 之后index++变成2
  • 你尝试访问test.value_[1],但这个数组只有索引0是有效的,索引1再次触发越界访问,又是未定义行为,所以输出还是随机值

修正方案(达到预期输出0和1)

要得到你预期的结果,得改掉全局变量的设计,把数组长度作为参数传入,同时严格控制索引不越界,还要记得管理动态内存避免泄漏:

#include <iostream>
template<typename T>
class A {
public:
    void Set(unsigned int length) {
        // 先释放之前的内存,防止内存泄漏
        delete[] value_;
        value_ = new T[length];
        for (unsigned int i = 0; i < length; i++) {
            value_[i] = i;
        }
        current_length_ = length;
    }
    ~A() {
        // 析构函数里释放内存,避免泄漏
        delete[] value_;
    }
    T* value_ = nullptr;
    unsigned int current_length_ = 0;
};
int main() {
    A<int> test;
    test.Set(1);
    // 先判断索引是否有效再访问
    if (test.current_length_ > 0) {
        std::cout << test.value_[0] << '\n';
    }
    test.Set(2);
    if (test.current_length_ > 1) {
        std::cout << test.value_[1];
    }
}

这样运行后就能得到预期的0和1了。

内容的提问来源于stack exchange,提问作者Salty 27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:52:31