您的位置 首页 基础

arm学习笔记–程序中变量引起的考虑

今天在写代码的时候,遇到一个奇怪的问题,在函数内定义局部变量数组,如果这个数组较大时程序就会跑飞,跑飞的地方如下:/*这一块是跑飞的…

今天在写代码的时分,遇到一个古怪的问题,在函数内界说部分变量数组,假如这个数组较大时程序就会跑飞,跑飞的当地如下:


/*这一块是跑飞的代码*/
uint32_t UserCode[244];
UserCode[0]=1;
/*代码over*/

假如数组比较小的话就没有问题,然后我上网查了一下材料这儿理一下:

1、因为部分变量创立的时分是静态创立在栈上的,所以栈的巨细约束了部分变量的size,假如栈小了,在运转的时分就会呈现溢出,程序当然就飞了。这儿就有概念上的疑问了:静态创立和动态创立差异是什么?部分变量占用的是栈的空间,那么其他类型的变量呢?下面咱们就来看这个问题。
2、静态创立和动态创立的差异
我个人的了解:静态创立分为两个部分,一个是编译时,这个时分咱们界说的静态变量和大局变量将在主动区分内存空间;一个是在运转时,便是部分变量,在栈区生成一个固定巨细的空间;为什么说他是静态的呢?因为这些变量或数组空间的巨细咱们是预先可知的。而动态创立呢?咱们运用malloc和free创立和开释内存空间,他们的巨细是按需分配,所以是动态创立,是在堆上分配的。
3、变量类型分为:部分变量,静态部分变量,大局变量,静态大局变量。他们在存储上能够依据创立的方法进行剖析,静态和大局都是在编译是进行创立的,所以是在一般的内存区域,部分变量是在运转时创立的,在栈上,可是栈上的空间和一般内存区域有没有重复呢?这个现在我还不清楚,还需要继续加深了解。在效果域上:部分变量在调用函数的时分创立,回来的时分体系自己进行毁掉;大局变量能够在工程的一切单元文件下运用;静态大局变量只能在当时单元文件下运用;静态部分变量,只创立一次,函数回来的时分不对他进行任何操作,所以下次进函数的时分他保存的是上一次的值,不会铲除。
4、堆和栈的差异:堆用于动态分配空间等,由程序员创立和操作;栈是由编译器主动分配的,首要用于寄存函数的参数值和部分变量。平常说的函数调用或中止入栈等等都是指的这儿编译器分配的栈。
好,现在咱们回到刚刚的呈现问题的代码上来,然后咱们看看怎样处理,因为剖分出是栈不行的状况,所以咱们就能够经过其他两种方法处理:
1、改动变量数组类型:大局或静态的,这样由编译器分配内存
2、运用malloc动态分配空间:因为malloc不占用栈区,所以也能够咱们先改为大局变量试试

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/275743.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部