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的更多相关文章

  1. golang 中Pointers Vs References

    原文: https://spf13.com/post/go-pointers-vs-references/ Pointers Vs References Some languages includin ...

  2. 内存地址 Memory Management

    Memory Management https://docs.python.org/2/c-api/memory.html Memory management in Python involves a ...

  3. 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 ...

  4. mfc extention dll 與 normal dll 的區別

    extention dll 1.指從MFC中繼承過來的DLL,一般要求使用共享MFC DLL進行連接,也要求調用者也使用MFC且使用共享MFC,如此可保證DLL與調用者有相同的MFC庫. 2.在使用資 ...

  5. MemProof教程

    简介 MemProof(内存清道夫)是AutomatedQA出品的一款非常不错的检测内存泄漏和资源泄漏的免费调试工具,适合于WIN32平台下使用DELPHI/C++ BUILDER开发的应用程序. 利 ...

  6. <转载>国外程序员推荐的免费编程书籍资源

    一.George Stocker 提供了一大串,分类如下: How to Design Programs: An Introduction to Computing and Programming 2 ...

  7. table2excel使用

    原table2excel代码 /* * 采用jquery模板插件——jQuery Boilerplate * * Made by QuJun * 2017/01/10 */ //table2excel ...

  8. 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 ...

  9. lock free数据结构内存回收技术-hazard pointer

    lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...

随机推荐

  1. python--Django(三)视图

    Django的视图 不同于其他语言的MVC模式,Django采用的是MVT模式,即Model.View.Template,这里的View其实质就是其他语言中的Controller(emmm.....) ...

  2. 二维码,QR码,编码原理与实现

    文章更新于:2020-02-18 注:开头是四篇文章的链接,下面是这四篇文章的截图 # 想了解二维码,读这几篇就够了 # 二维码的基础原理是什么 https://cli.im/news/help/10 ...

  3. go 错误处理与测试

    Go 没有像 Java 和 .NET 那样的 try/catch 异常机制:不能执行抛异常操作.但是有一套 defer-panic-and-recover 机制(参见 13.2-13.3 节). Go ...

  4. Quil-delta-enhanced 简介

    Quill 是一款时下非常热门的富文本编辑器,它拥有非常强大的扩展能力,可以让开发者根据自己的需要编写插件,使编辑器支持的内容类型更加丰富.它之所以能够拥有这么强大的扩展能力,一方面是因为它的架构和 ...

  5. Android Google Play app signing 最终完美解决方式

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/105561341 本文出自[赵彦军的博客] 在 GooglePlay 创建 App ...

  6. intellij idea 设置用真机测试android

    android自带的模拟器是不容置疑的慢,genymontion虽然快,但是觉得有点怪的感觉,哈哈,其实这些都不是重点. 之前是用myeclipse开发android的,虽然一直很想用eclipse来 ...

  7. L24 word2vec

    词嵌入基础 我们在"循环神经网络的从零开始实现"一节中使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择.一个主要的原因是,one-hot 词向量无 ...

  8. Python - 利用词云wordcloud,jieba和中国地图制作四大名著的热词图

    热词图很酷炫,也非常适合热点事件,抓住重点,以图文结合的方式表现出来,很有冲击力.下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨 ...

  9. 处理数字的类 —— Math类 、 Random类 、 BigDecimal类 与 BigInteger类

    在我们学习C语言时,我们处理数据时要调用很多函数,那么,Java也有很多的方法可以来处理数值的类. 那么,在本篇博文中,本人就来讲解三个用于处理数值的类 -- Math类 . Random类 与 Bi ...

  10. windows UAC 提权实验(CVE-2019-1388)

    --------------------------------------------------------------------------------- 声明:本文仅做学习,实验主机为虚拟机 ...