Pointers and Memory
Stanford CS Education Library #102
一、Basic Pointers
指针主要有两个用途:使不同的代码段共享信息、方便链表(树)的处理。
指针示意图:

dereference操作会根据指针的值去找到它的pointee。
NULL是一个特殊的指针值(一般是地址0),表示这个指针不指向任何pointee。

指针的赋值会使得两个指针指向相同的pointee,但pointee本身不会改变:

传指针vs传值:

定义一个指针后,这个指针是没有被初始化的:

这时候如果进行dereference操作会发生Runtime Error.
对于Java、LISP等语言,当定义一个指针时,系统会将其设置为NULL,并且会在dereference操作时检查其值,这也是Java比较慢的原因之一。

一个比较典型的指针错误:
void BadPointer()
{
int* p; //allocate the pointer, but not the pointee
*p = 42; //serious RE
}
当执行*p时:

二、Local Memory
函数开始运行时,会为局部变量分配内存,结束运行会回收内存。
看一个错误的例子:
//TAB -- The Ampersand Bug function
int* TAB()
{
int temp;
return (&temp);
}
void Victim()
{
int* ptr;
ptr = TAB();
*ptr = 42; //The pointee was local to TAB
}
问题在于TAB()返回了一个局部变量的地址,但这个局部变量的空间已经被回收,ptr指针没有pointee。
三、Reference Parameters
传值:
void B(int worth)
{
worth++;
// T2
}
void A()
{
int netWorth = 55; //T1
B(netWorth);
// T3 -- B() did not change netWorth
}

传指针:
void B(int* worthRef)
{
(*worthRef)++;
// T2
}
void A()
{
int netWorth = 55; //T1
B(&netWorth);
// T3

传指针在c++中可以通过传引用的方式实现:

四、Heap Memory
分配示意图:

释放示意图:

释放后,指针虽然还在,但却不可以在使用。
//size以字节为单位,分配成功返回指针,失败返回NULL
void* malloc(unsigned long size);
//不需要size,因为heap manager之前已经记录过
void free(void* heapBlockPointer);


一个StringCopy()的例子:

对于分配的堆内存,只有一个负责释放的,要么是caller,要么是callee:

Pointers and Memory的更多相关文章
- golang 中Pointers Vs References
原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...
- 内存地址 Memory Management
Memory Management https://docs.python.org/2/c-api/memory.html Memory management in Python involves a ...
- Questions that are independent of programming language. These questions are typically more abstract than other categories.
Questions that are independent of programming language. These questions are typically more abstract ...
- mfc extention dll 與 normal dll 的區別
extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...
- MemProof教程
简介 MemProof(内存清道夫)是AutomatedQA出品的一款非常不错的检测内存泄漏和资源泄漏的免费调试工具,适合于WIN32平台下使用DELPHI/C++ BUILDER开发的应用程序. 利 ...
- <转载>国外程序员推荐的免费编程书籍资源
一.George Stocker 提供了一大串,分类如下: How to Design Programs: An Introduction to Computing and Programming 2 ...
- table2excel使用
原table2excel代码 /* * 采用jquery模板插件——jQuery Boilerplate * * Made by QuJun * 2017/01/10 */ //table2excel ...
- The correct way to initialize a dynamic pointer to a multidimensional array
From:https://stackoverflow.com/questions/18273370/the-correct-way-to-initialize-a-dynamic-pointer-to ...
- lock free数据结构内存回收技术-hazard pointer
lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...
随机推荐
- 打造一款 刷Java 知识的小程序(一)
一.为什么要打造 Java要学的东西太多了,所以准备把这些知识汇总到一起,而小程序是一个比较好的入口,借助微信客户端,打开方便. 二.打造成什么样 首页展示:包含了Java各大知识点模块 知识点展示: ...
- sqlalchemy + alembic数据迁移
需要安装的包工具 pip install pymysql pip install sqlalchemy pip install alembic 创建表 新建models.py from sqlal ...
- Vue-cli2.0 第3节 解读Vue-cli模板
Vue-cli2.0 第3节 解读Vue-cli模板 目录 Vue-cli2.0 第3节 解读Vue-cli模板 第3节 解读Vue-cli模板 1. npm run build命令 2. main. ...
- "三号标题"组件:<h3> —— 快应用组件库H-UI
 <import name="h3" src="../Common/ui/h-ui/text/c_h3"></import> < ...
- 微信小程序页面通信
目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...
- Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置
最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...
- D - Yet Another Monster Killing Problem
题目连接: https://codeforces.com/contest/1257/problem/D 题目大意: n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值.耐 ...
- Vue定义全局过滤器filter
这里介绍的是多个过滤器一起添加到全局中 1.创建方法 首先src下新建plugin文件夹,用来存放插件. 在plugin文件夹内新建filters.js,编写方法(如隐藏手机号码等等...) /** ...
- [转]PHP利用PCRE回溯次数限制绕过某些安全限制
这次Code-Breaking Puzzles中我出了一道看似很简单的题目pcrewaf,将其代码简化如下: <?php function is_php($data){ return preg_ ...
- [git] github上传项目(使用git)、删除项目、添加协作者
来源:http://www.cnblogs.com/sakurayeah/p/5800424.html (怕链接失败,所以直接就就复制过来啦,感谢作者) 一.注册github账号 github网址ht ...