一个很简单的问题,曾经不知道,现在明白了

本文解释了在编程过程中,为何在栈上声明大型数组会遇到溢出错误,而使用堆分配则不会。通过对比栈和堆的特点,阐述了两者在内存管理上的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算是写给自己看的吧~~

首先这个是我在大一的时候编程的时候发现的,在编译其中,你如果声明一个

int a[1000000](或者是更大,这个得看编译器了)

编译器是回报错的,说是overflow的,当时也没注意为什么,所以就用的malloc或者是new函数

int * a = (int *)malloc(1000000)这样就行了((int *)的作用是把malloc的返回的void *指针转换为int *)

int * a = new int[1000000]这样也行

为什么呢?

这个就要涉及到这些数据在内存中的存储方式了,在刚开始main函数中声明的数组和局部变量是存储在栈上的,由编译器自己管理的,编译器的栈大小一般是1M或者是2M,是向低地址扩展的,是固定的,不可能存放100W个Int型数据,所以不行。

但是malloc和new是由程序猿自己分配的,分配在堆上,堆是向高地址扩展的,是不连续的,所以大小可以很大,100M个不成问题啊,所以这个可以

好了,问题解决了,算是回忆一下自己的大一吧大笑

PS:栈是编译时确定,堆是运行时确定,所以栈的速度比堆快


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值