空悬指针:它曾经指向一个有效地址,但是现在不再指向有效地址,就是原来的那块地址不能通过这个指针区访问了。这通常是因为指针所指的内存单位被释放了并且不再有效了。空悬指针存在并没有什么问题,除非你尝试通过这个指针访问指向的地址空间。不遗留任何悬空指针总是最好的实践方式。(被free或者delete后,需要申明 *p=NULL)
野指针:它没有被正确的初始化于是指向一个随机的内存地址。存在野指针是一个严重的错误
1.指针指向常量字符串
#include <stdio.h>
int main()
{
char *p="ABC";
p[0]='B';//c++有警告warning: ISO C++ forbids converting a string constant to 'char*' ,
//常量字符串不能被修改,运行时程序出错。
return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define max(a,b) a##b
void wrong(char *p)
{
p=(char *)malloc(100*sizeof(char));
}
void right(char **p)
{
*p=(char*)malloc(100*sizeof(char));
}
void test()
{
char *p=NULL;
//wrong(p);//并没有申请成功
right(&p);//申请成功
//memset(p, 0, sizeof(char)*100);//不可用sizeof(p) 指针只有4个字节
p[0]='A';
p[1]='B';
//memset(p,0,sizeof(p));
printf("%s\n", p);//输出会有垃圾值,原因是没有还原申请内存原来存在的数据,调用memset
}
int main()
{
test();
return 0;
}