栈太小,大数组去堆上开
局部数组开在栈上,栈通常只有几 MB:int a[100] 才 400 字节随便开,int a[10000000] 约 40 MB,一进函数就栈溢出。想开大数组:要么开成全局变量,要么用 malloc 去堆上要——堆受整机内存限制,几百 MB 也要得到,而且大小是运行时才算的,正好接住「先读 n 再开 n 个」的题目。
malloc 标准姿势
int *p = malloc(n * sizeof(int));(需 #include <stdlib.h>)。三个细节:一是 malloc 按字节计数,忘乘 sizeof 只拿到四分之一的地,后面全是越界写;二是要不到内存时返回 NULL,if (p == NULL) return 1; 别硬用;三是拿到的内存不清零、全是垃圾值,先赋值再使用(想直接拿全 0 用 calloc(n, sizeof(int)))。到手之后 p[i] 随便读写,和普通数组手感一模一样。
free 配对与内存泄漏
malloc 和 free 必须一一配对:写下 malloc 的同时就把配对的 free 先写好,再回头填中间逻辑,永远不会漏。free 之后 p 里还残留旧地址(悬空指针),再用或对同一块再 free 一次都是未定义行为——好习惯是紧跟 p = NULL;,误碰会稳定报错好定位,且 free(NULL) 是安全的空操作。泄漏不减速,但内存只增不减,多组数据下吃光额度就是 MLE。