【C语言学习笔记】存储类、链接和内存管理
因为对内存管理部分一直没有很清楚的思路,所以一直在找资料想系统看一下这部分的内容。在C primer plus里看到了这一章,虽然大多都是心知肚明的东西,但是还是很多概念性系统性的东西让我眼前一亮,把笔记整理到这里来,用于自己回顾。
作用域:
- l 代码块作用域:在代码块中(花括号包含)定义的变量,函数的形参也具有代码块作用域
 - l 函数原型作用域:函数原型中使用的变量名
 - l 文件作用域(全局变量):在所有函数之外(包括main函数)定义的变量具有文件作用域。
 
链接:
- l 外部链接:具有外部链接的变量可以在一个多文件程序的任何地方使用
 - l 内部链接:(static)具有内部链接的变量可以在一个文件的任何地方使用
 - l 空链接:代码块作用域或者函数原型作用域的变量有空链接
 
存储时期
- l 静态存储时期:具有文件作用域的变量具有静态存储时期(文件作用域变量static只表示链接类型而非存储时期)。一个具有静态存储时期的变量在程序执行期间将一直存在
 - l 自动存储时期:代码块作用域的变量具有动态存储时期。程序进入代码块为这些变量分配内存,退出代码块这些内存自动释放。
 
存储类:
- l 自动变量:就是代码块内的变量,代码块作用域空链接自动存储时期
 - l 寄存器变量:使用关键字register之后的代码块内代码可以被存在CPU寄存器中或者在速度最快的可用内存中,可以比普通变量更快的被访问
 - l  具有代码块作用域的静态变量:在代码块内用static声明变量,该变量具有代码块作用域与空链接,但是在函数调用结束并不消失。到下一次调用计算机还是记录着它的值。函数参数不能用static
void staticTest() {
int p = ;
static int q = ;
cout << p++ << " " << q++ << endl;
} int main(){
staticTest();
staticTest();
staticTest(); return ;
}
 
输出:1,1
1,2
1,3
可见p每次都是1,而q的值则被记录下来了。
- l 具有外部链接的静态变量:全局变量,在别的文件中extern之后可用。声明数组时不必指明数组大小。如果不显式初始化,会被自动赋值0.
 - l 具有内部链接的静态变量:staitic全局变量
 
存储类和函数:函数也具有存储类
- l 外部的(default):可被其他文件中的函数调用
 - l 静态的:只可以在定义它的文件中使用
 - l (C99增加了第三种:内联函数)
 
内存分配:malloc()和free()
- l malloc():接受一个所需内存字节数的参数,返回一个指向分配内存第一个字节地址的指针(void*)。
 - e.g, double *ptd = (double*)malloc(30*sizeof(double));
 - 因为返回通用指针,故而需要为返回值类型指派适当类型.如果找不到所需空间返回空指针
 - l free():接受一个指针作为参数释放malloc的内存 e.g. free(ptd);
 
突然明白为什么自动变量存储在堆栈中呢,因为代码块内的变量在执行该代码块的时候才进入内存而在结束时又出来,符合先进后出后进先出的规律。
【C语言学习笔记】存储类、链接和内存管理的更多相关文章
- 《C prime plus (第五版)》 ---第12章 存储类.链接和内存管理
		
12-1:存储类: 1.作用域: 代码块作用域,函数原型作用域和文件作用域. 2.链接:分为外部链接,内部链接和空链接.代码块作用域和函数原型作用域都是空连接,意味着是私有的.而文件作用域的变量可能是 ...
 - python学习笔记10(Python的内存管理)
		
用这张图激励一下自己,身边也就只有一位全栈数据工程师!!! 32. Python的内存管理 1. 对象的内存使用 对于整型和短字符串对象,一般内存中只有一个存储,多次引用.其他的长字符串和其他对象 ...
 - java学习笔记(4):内存管理
		
在内存的方面,Java自身带有垃圾运行机制,表面上好像我们可以忽略不计,但是如果我们对其加以理解的话,说不定有时会达到事半功倍的效果. 所以自己花些时间整理一些此类的资料. 一.基本概念 1.栈 对于 ...
 - Windows程序设计学习笔记(一)Windows内存管理初步
		
学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...
 - 《C# 语言学习笔记》——C# 简介
		
1 什么是.NET Framework .NET Framework 是Microsoft为开发应用程序而创建的一个富有革命性的新平台. 1.1 .NET Framework 的内容 .NET Fra ...
 - HTML语言学习笔记(会更新)
		
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
 - memcached学习笔记——存储命令源码分析下篇
		
上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...
 - 2017-05-4-C语言学习笔记
		
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
 - GO语言学习笔记(一)
		
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
 - Haskell语言学习笔记(88)语言扩展(1)
		
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
 
随机推荐
- JStorm之Nimbus简介
			
本文导读: ——JStorm之Nimbus简介 .简介 .系统框架与原理 .实现逻辑和代码剖析 )Nimbus启动 )Topology提交 )任务调度 )任务监控 .结束语 .参考文献 附:JStor ...
 - ACM: How many integers can you find-数论专题-容斥原理的简单应用+GCD
			
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
 - Kosaraju 算法
			
Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...
 - UVA 11076 - Add Again(组合)
			
题目链接 脑子抽了,看错题了,神奇的看成没有0了.主要问题把n个数插入m个相同的数,把m个数给分成1-m堆,然后插到n+1空里. #include <cstdio> #include &l ...
 - BZOJ4518: [Sdoi2016]征途
			
Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...
 - JS中常遇到的浏览器兼容问题和解决方法【转】
			
今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上: 常遇到的关于浏览器的宽高问题: //以下均可console.log()实验 var winW=docu ...
 - GO语言练习:map基本用法
			
1.代码 2.运行 1.代码 文件:map.go package main import "fmt" type PersionInfo struct{ ID string Name ...
 - 选择Nodejs的N个理由
			
选择Nodejs的N个理由 作者 马德奎 发布于 2014年9月25日 Caleb Madrigal是 来自美国密尔沃基市的一名软件顾问.四年前,他在听说“将JavaScript用作服务器端语言”这样 ...
 - jquery js javascript select 无限级 插件 优化foxidea版
			
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - spring mvc 拦截器 拦截子目录
			
项目中碰到这一个问题: 对于/user/loginpage,/user/login这一类的url,放行: 对于/user/{userId}/xxx(xxx不为空)的操作,需要拦截,url-patter ...