变量、参数和内存分配数组
目录app
变量的类型函数
按做用范围分类布局
能够把变量分为局部变量和全局变量spa
按变量的存储类型操作系统
自动存储类型(默认)线程
自动存储类型修饰符指定了一个局部变量为自动的,这意味着,每次执行到定义该变量的语句块时,都将会为该变量在内存中产生一个新的拷贝,并对其进行初始化指针
静态存储变量 code
外部存储类型索引
寄存器存储类型
参数的类型
实参和形参
变量和参数的区别
参数表示一个值,过程但愿您在调用它时传递该值。过程的声明定义其参数.
变量表示在您调用过程时传递给过程参数的那个值。调用代码在它调用过程时提供此变量.
内存的静态分配和动态分配
要弄懂这个问题,首先你得知道静态和动态指的是什么。我的以为卡耐基上的解释很经典:
“The word static refers to things that happen at compile time and link time when the program is constructed—as opposed to load time or run time when the program is actually started.”
“The term dynamic refers to things that take place when a program is loaded and executed. ”
说白了,内存的静态分配和动态分配的区别主要是两个:
一是时间不一样。静态分配发生在程序编译和链接的时候。动态分配则发生在程序调入和执行的时候。
二是空间不一样。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,好比局部变量的分配。动态分配由函数malloc进行分配。不过栈的动态分配和堆不一样,他的动态分配是由编译器进行释放,无需咱们手工实现。
对于一个进程的内存空间而言,能够在逻辑上分红3个部份:代码区,静态数据区和动态数据区。动态数据区通常就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不一样的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每一个线程都有私有的“栈”,因此每一个线程虽然代码同样,但本地变量的数据都是互不干扰。一个堆栈能够经过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序经过堆栈的基地址和偏移量来访问本地变量。
通常,用static修饰的变量,全局变量位于静态数据区。函数调用过程当中的参数,返回地址,EBP和局部变量都采用栈的方式存放。
其它:
所谓动态内存分配就是指在程序执行的过程当中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样须要预先分配存储空间,而是由系统根据程序的须要即时分配,且分配的大小就是程序要求的大小。
例如咱们定义一个float型数组:float score[100];
可是,在使用数组的时候,总有一个问题困扰着咱们:数组应该有多大?在不少的状况下,你并不能肯定要使用多大的数组,好比上例,你可能并不知道咱们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即便你知道你想利用的空间大小,可是若是由于某种特殊缘由空间利用的大小有增长或者减小,你又必须从新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。可是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数状况下会浪费大量的内存空间,在少数状况下,当你定义的数组不够大时,可能引发下标越界错误,甚至致使严重后果。
咱们用动态内存分配就能够解决上面的问题. 所谓动态内存分配就是指在程序执行的过程当中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样须要预先分配存储空间,而是由系统根据程序的须要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较能够知道动态内存分配相对于景泰内存分配的特色:
一、不须要预先分配存储空间;
二、分配的空间能够根据程序的须要扩大或缩小。
要实现根据程序的须要动态分配存储空间,就必须用到malloc函数.
malloc函数的原型为:void *malloc (unsigned int size) 其做用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。因此在调用该函数时应该检测返回值是否为NULL并执行相应的操做。
栈机制——运行时内存布局(Runtime Memory Layout)
一个程序要运行,就要先将可执行文件装载到计算机内存中。装载是操做系统掌控的,通常而言,操做系统将程序装入内存后,将造成一个随时能够运行的进程空间,该进程空间分四个区域,由上到下为:代码区(code area)、全局数据区(data area)、堆区(heap area)、栈区(stack area);一个运行的程序在内存中表示为这四个空间区域,其中代码区存放程序的执行代码。所谓执行代码就是索引了一个个函数块代码,它由函数定义块的编译获得;全局数据区存放全局数据、常量、文字量、静态全局量和静态局部量;堆区存放动态内存,供程序随机申请试用;栈区存放函数数据区(即局部数据区),它动态地反映了程序运行中的函数状态,其运动轨迹正好用来观察函数的调用和返回,从而研究其函数机制。
初始化
在不进行显式初始化的状况下,外部变量和静态变量都将被初始化为0,而自动变量和寄存器的初值则没有定义(即初值为无用的信息)
对于外部变量与静态变量来讲,初始化表达式必须是常量表达式,且只初始化一次(从概念上讲在程序开始执行前进行初始化);对于自动变量和寄存器变量,则在每次进入函数或程序块时都将被初始化
建议使用显示的赋值语句,如int low = 0;而不是int low; low = 0;
字符数组的初始化比较特殊:能够用一个字符串来代替用花括号括起来并用逗号分隔的初始化表达式序列,如char pattern[] = "ould"; //数组的长度是5,加上一个'\0'为字符串结束符