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

给全局变量动态分配内存的代码为何能正常运行?

#include <stdio.h>
int* arr = new int[10];
int main()
{
    for (int i = 0; i < 5; i++) {
        arr[i] = i;
        printf("%d", arr[i]);
    }
    return 0;
}

运行输出:01234


原理说明

你产生误解的核心原因是混淆了C语言规则和C++规则,以及对全局变量初始化的阶段认知不完整:

  • 首先上述代码是C代码(包含C语言不支持的new关键字),C的全局变量初始化分为两个阶段:
    • 静态初始化阶段:针对编译期可确定值的常量初始化,该阶段在程序加载到内存时完成,早于程序运行逻辑执行,也就是你原本认知里的「初始化发生在程序运行前」的情况。
    • 动态初始化阶段:针对非常量表达式的初始化,该阶段在main函数执行前、程序运行环境已经准备完成后执行,代码中的int* arr = new int[10];就属于这个阶段的执行逻辑,new的内存分配操作此时正常调用,所以指针arr会指向合法的堆内存。
  • 你原有认知的来源是C语言的规则:C语言要求全局变量必须用编译期常量初始化,要是用C写int *arr = malloc(10*sizeof(int));会直接编译报错,但该规则不适用于C++。

注意事项

  • 不同编译单元的全局变量动态初始化顺序没有明确标准,如果你在其他全局变量的初始化逻辑中引用arr,可能出现arr还未完成初始化的问题,存在安全隐患。
  • 全局new申请的内存没有对应的delete[]释放,虽然程序退出时系统会自动回收堆内存,但不符合内存管理的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:06:05