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

咨询C++中int a[100]与int *a=new int[100]的其他差异

C++中int a[100]与int *a = new int[100];的核心差异

除了你提到的初始化差异,二者还有以下关键区别:

  • 内存分配位置不同

    • int a[100]如果是局部变量,内存分配在栈(stack)上;如果是全局/静态变量,分配在静态存储区。栈内存空间有限(通常仅几MB),定义过大的数组容易触发栈溢出。
    • int *a = new int[100]的内存分配在堆(heap)上,堆的可用空间远大于栈,适合存储大数据量,但内存需要手动管理。
  • 内存释放方式不同

    • 栈上的局部数组会在出作用域时自动销毁,无需手动释放;全局/静态数组则在程序结束时自动释放。
    • 堆上的数组必须手动调用delete[] a;释放,否则会造成内存泄漏——占用的内存直到程序结束才会被系统回收。
  • 类型本质不同

    • int a[100]是真正的数组类型,sizeof(a)返回整个数组的字节数(比如100*4=400字节,具体取决于int的大小),可以用std::is_array_v<decltype(a)>判断其数组类型属性。
    • int *a是指向int的指针,sizeof(a)返回的是指针本身的大小(64位系统通常为8字节),和数组长度无关。即便它指向堆数组的首地址,其本质依然是指针而非数组。
  • 数组大小的灵活性不同

    • int a[100]的大小必须是编译期常量(C标准规定),无法用运行时输入的变量作为数组大小(部分编译器如GCC支持变长数组作为扩展,但不属于标准C)。
    • new int[100]的大小可以是运行时变量,比如int n; std::cin >> n; int *a = new int[n];,这是标准C++允许的动态数组用法。
  • 生命周期不同

    • 局部栈数组的生命周期仅限于其所在的作用域(比如函数内部的数组,函数执行完毕后立即销毁);全局/静态数组的生命周期与整个程序一致。
    • 堆数组的生命周期由程序员控制:从new分配内存开始,到delete[]释放内存结束。即便数组指针超出作用域,只要未执行释放操作,堆内存依然有效,但此时指针会变成野指针,访问会导致未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:32:57