码迷,mamicode.com
首页 > 其他好文 > 详细

Pointers and Memory

时间:2020-01-01 23:33:48      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:不可   int   开始   方式   ati   rsa   失败   --   共享   

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

标签:不可   int   开始   方式   ati   rsa   失败   --   共享   

原文地址:https://www.cnblogs.com/EIMadrigal/p/12130901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!