变量、参数和内存分配

目录

  • 变量的类型
  • 参数的类型
  • 变量和参数的区别
  • 内存的静态分配和动态分配
  • 栈机制——运行时内存布局(Runtime Memory Layout)
  • 初始化

变量的类型

按作用范围分类

可以把变量分为局部变量和全局变量

按变量的存储类型

自动存储类型(默认)

自动存储类型修饰符指定了一个局部变量为自动的,这意味着,每次执行到定义该变量的语句块时,都将会为该变量在内存中产生一个新的拷贝,并对其进行初始化

静态存储变量

外部存储类型

寄存器存储类型

参数的类型

实参和形参

变量和参数的区别

参数表示一个值,过程希望您在调用它时传递该值。过程的声明定义其参数.
变量表示在您调用过程时传递给过程参数的那个值。调用代码在它调用过程时提供此变量.

内存的静态分配和动态分配 

要弄懂这个问题,首先你得知道静态和动态指的是什么。个人觉得卡耐基上的解释很经典:

“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];   

但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于景泰内存分配的特点:

   1、不需要预先分配存储空间;

   2、分配的空间可以根据程序的需要扩大或缩小。

要实现根据程序的需要动态分配存储空间,就必须用到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'为字符串结束符

转载于:https://www.cnblogs.com/IOS-Developer/p/4117618.html

变量、参数和内存分配相关推荐

  1. 读取当前linux进程内存_(笔记)Linux上的内存分配

    作者: LemonNan 原文: https://juejin.im/post/5ee3c34a518825430c3ad31d 前言 本篇是对Linux内存分配的一个学习笔记. 程序内存结构 下面是 ...

  2. C语言的变量的内存分配

    今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了... 先看一下两段代码: char* toStr() {char *s = "abcdefghijkl&qu ...

  3. 释放变量所指向的内存_C++动态内存分配(学习笔记:第6章 15)

    动态内存分配[1] 动态申请内存操作符 new new 类型名T(初始化参数列表) 功能: 在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值. 结果值: 成功:T类型的指针,指向 ...

  4. [转载]内存分配 知识,全局,局部,静态变量

    [转载]内存分配 知识,全局,局部,静态变量 预备知识-程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变 ...

  5. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  6. java 内存回收参数_JVM常用参数(内存分配 内存回收日志)(七)

    内存监控 -verbose:gc 测试代码 public static voidmain(String[] args){ List classes=new ArrayList();int count= ...

  7. Yarn 内存分配管理机制及相关参数配置

    理解Yarn的内存管理与分配机制,对于我们搭建.部署集群,开发维护应用都是尤为重要的,对于这方面我做了一些调研供大家参考. 一.相关配置情况 关于Yarn内存分配与管理,主要涉及到了ResourceM ...

  8. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  9. C语言 内存分配 地址 指针 数组 参数 解析

    指针简介 : 指针式保存变量地址的变量; -- 增加阅读难度 : 指针 和 goto 语句会增加程序的理解难度, 容易出现错误; -- ANSI C : American National Stand ...

  10. C/C++语言变量声明内存分配

    [cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...

最新文章

  1. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-08项目人力资源(Human Resource)管理...
  2. 成为编程高手的二十二条军规
  3. 解密小程序云开发数据库
  4. linux arm内核栈切换,ARM Linux中断发生时内核堆栈切换
  5. LMS Algorithm 最小均方算法
  6. windows 2008 64位oracle11g部署问题(1)之警告-启动database control时出错
  7. 3dMax模型尺寸更改与模型均匀缩放
  8. mac电脑安装mysql客户端
  9. 彩色图像灰度化MFC
  10. 华为 ensp 下载安装
  11. leetcode 904 水果成篮
  12. 【一起学Rust | 设计模式】新类型模式
  13. 情人节送男生什么礼物好?2022情人节礼物推荐
  14. OpenAI又放大招:连接文本与图像的CLIP,在ImageNet上效果媲美ResNet50
  15. Fzu-2190 非提的救赎 (单调栈)
  16. apr软件包下载安装,apache安装
  17. org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
  18. OpenNURBS 3DM Viewer
  19. 2023年Android现代开发
  20. 用友2018秋招Java笔试题(三)

热门文章

  1. 定义函数,实现折半查找算法
  2. java 串行化_Java中的串行化
  3. 申请苹果开发者账号(2016最新版)
  4. 使用memcpy函数的耗时测试(拷贝不同大小数据量耗时不同)
  5. JAVA EE面试重点
  6. matlab 实现disparity,Matlab里的disparity map 计算
  7. 计算机课件制作ppt,计算机应用基础_幻灯片制作ppt课件
  8. 世界上最伟大的十大公式
  9. 数显之家快讯:【SHIO世硕心语】董明珠北大演讲:十大掌声雷动的精彩看点!
  10. python提升算法3_XGBOOST_docs_Scikit-LearnAPI_XGBClassifier_train参数01