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. GIT本地安装及汉化

    GIT本地安装及汉化过程 1.下载地址: 链接:https://pan.baidu.com/s/1TMxxngZy4Y1De5eC1kSTMg 提取码:e593 2.下载完成之后如下图所示3个文件: ...

  2. gdb调试工具常用命令 && kdb

    编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main gdb中命令: 回车键:重复上一命令 (gdb)help:查看命令帮助,具体命令查询在gdb中输入help ...

  3. docker-compose错误

    1.错误信息: ERROR: for gamehall Get https://hub.tondeen.com/v1/_ping: http: server gave HTTP response to ...

  4. python 函数--迭代器

    一.迭代协议: 可以被迭代要满足要求的就叫做可迭代协议.内部实现__iter__方法. iterable:可迭代的--对应的标志. 什么叫做迭代?:可以一个一个取值,就像for循环一样取值. 字符串, ...

  5. MySQL入门,第八部分,多表查询(一)

    一.数据库脚本 #-------------------------------------------------------------------------------- #--------- ...

  6. canvas压缩、裁切图片和格式转换的方法

    按照大小压缩图片,或者按照特定分辨率裁切图片,转为blob数据.自动处理ios中可能存在的照片偏差90°问题. 例如,获取300*300大小的头像,实现以下效果: 使用方式: <!-- 引入js ...

  7. 09-soap接口类型进行测试webservice协议

    webxml.com.cn/zh_cn/weather_icon.aspx webxml.com.cn/webservices/weatherWS.asmx? 以上2个url可用来免费使用(经典场景) ...

  8. CentOS安装C函数库的man帮助

    安装linux可能没有安装C的man帮助, 像我安装时选择的是最小化安装就没有, 网上的大多是ubunu的安装方式,或者是C++的man帮助, 都不适合,那么CentOS安装C man手册的方法就是: ...

  9. 条件变量 condition_variable wait_until

    wait_until(阻塞当前线程,直到条件变量被唤醒,或直到抵达指定时间点) #include <iostream> #include <atomic> #include & ...

  10. nghttp2 交叉编译

    touch run.sh chmod 755 run.sh mkdir build cd build ../run.sh run.sh #!/bin/bash #cd build ../configu ...