/*
* zeroPoint.cpp
*
* Created on: 2016年8月29日
* Author: zroad
*/
#include<iostream>
#include<string>
#include<cstring>
#include<stdlib.h>
using namespace std;
class A {
public:
void Func(void){
cout << "Func of class A"<< endl;
}
};
void test(A *p2) {
A a;
p2 = &a; // 注意 a 的生命期 ,只在这个程序块中(花括号里面的两行),而不是整个test函数
p2->Func(); // p是“野指针”
}
int main(){
//一、空指针概率
//1、什么是空指针:赋值为空指针常量的指针
//空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。
int *p, *q;
double *r;
string *s;
//2、空指针常量:
//0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)
//等都是空指针常量,C++通常选用0.
p = 0;
q = 0;
r = 0;//赋值为空指针常量,对指针变量的类型没有要求
s = 0;
//3、NULL指针:
//NULL 是一个标准规定的宏定义,用来表示空指针常量,因此,
//除了上面的各种赋值方式之外,还可以用 p = NULL;
//来使 p 成为一个空指针。
string *ss = NULL;
cout << &p <<" "<<&q <<" "<< &r <<" "<<&s <<" "<<&ss <<" "<<endl;
//4、零指针:
//零值指针,是值为0的指针,可以是任何一种指针类型。
//二、野指针:不是空指针,是指向"垃圾内存"的指针
//野指针产生的原因:
//1、指针变量未被初始化:任何指针变量刚被创建时
//不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。
string s0 = "Hello,c++";
string *s1 = &s0; //若不对s1合理赋值,则是野指针
string ss1 = *s1;
cout << ss1 <<endl;
//2、指针p被free或者delete之后,没有置为NULL,
让人误以为p是个合法的指针
char *pp = (char *) malloc(100);
strcpy(pp, "hello");
free(pp); // p 所指的内存被释放,但是p所指的地址仍然不变
if(pp != NULL){ //没有起到防错的作用
//strcpy(pp, "world"); // 出错
}
//3、指针操作超越了变量的作用范围
//test();
return 0;
}
空指针与野指针
最新推荐文章于 2024-01-06 21:55:12 发布