标签:不可 int 开始 方式 ati rsa 失败 -- 共享
Stanford CS Education Library #102
指针主要有两个用途:使不同的代码段共享信息、方便链表(树)的处理。
指针示意图:
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
时:
函数开始运行时,会为局部变量分配内存,结束运行会回收内存。
看一个错误的例子:
//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
。
传值:
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++中可以通过传引用的方式实现:
分配示意图:
释放示意图:
释放后,指针虽然还在,但却不可以在使用。
//size以字节为单位,分配成功返回指针,失败返回NULL
void* malloc(unsigned long size);
//不需要size,因为heap manager之前已经记录过
void free(void* heapBlockPointer);
一个StringCopy()
的例子:
对于分配的堆内存,只有一个负责释放的,要么是caller
,要么是callee
:
标签:不可 int 开始 方式 ati rsa 失败 -- 共享
原文地址:https://www.cnblogs.com/EIMadrigal/p/12130901.html