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

C++中为何可以将不同大小动态数组的指针互相赋值

你提到的代码可整理为如下可运行版本:

#include <iostream>
int main() {
    int* oldArray = new int[5];
    for (int i = 0; i < 5; i++)
    {
        oldArray[i] = i;
    }

    int* newArray = new int[10];
    for (int i = 0; i < 10; i++)
    {
        newArray[i] = i * i;
    }

    delete[] oldArray;
    oldArray = newArray;
    
    for (int i = 0; i < 10; i++)
    {
        std::cout << oldArray[i] << std::endl;
    }
    // 补充:使用结束后需释放内存避免泄漏
    delete[] newArray;
    return 0;
}
为什么可以直接赋值?

核心逻辑是C++的指针本身不携带它指向的内存块的大小信息:

  • oldArray和newArray的类型都是int*,也就是指向int的指针,本质上只是一个存储内存地址的变量,只要类型匹配就可以互相赋值,和它们当前指向的内存块有多大没有关系。
  • 用new[]申请的动态数组的大小,是由C++标准库的内存分配器在底层维护的,只在调用delete[]的时候会被用到,不会暴露给指针变量,编译器也不会在编译阶段检查两个指针指向的数组大小是否一致。
这段代码的执行逻辑说明
  1. 首先申请长度为5的int数组,首地址赋值给oldArray
  2. 再申请长度为10的int数组,首地址赋值给newArray
  3. 调用delete[] oldArray释放oldArray原来指向的长度为5的数组,避免内存泄漏
  4. 把newArray存储的长度为10的数组的首地址赋值给oldArray,此时两个指针都指向同一块长度为10的数组内存
  5. 后续通过oldArray访问10个元素是合法操作,因为它此时指向的内存本身就是长度为10的int数组

注意:C++不会帮你记录指针当前指向的数组长度,你需要自己手动维护这个信息,如果后续访问oldArray时超出了10个元素的范围,就会触发内存越界的未定义行为,可能导致程序崩溃或者数据异常。另外如果此处没有先释放oldArray原来指向的内存就直接赋值,会造成内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:45:03