//错误举例1:
//对控制指针进行赋值
int *test_point = NULL;
*test_point = 9;
//正确用法
int *test_point = NULL;
int array[10];
test_point = array;
//错误举例2
char test_string[8];
sprintf(test_string,"1234567890");//char的数组长度不够,导致死机
//正确用法
//推荐使用snprintf
snprintf(test_string,sizeof(test_string),"1234567890");//这样可以防止死机,但是最好长
//度不要越界
//错误举例3
typedef struct test
{
char ctest;
char buf[31];
}testt;
testt kk,tt;
memcpy((&kk)->ctest, (&tt)->ctest, sizeof(testt));//没有取变量地址,造成访问非法内存
//正确用法
memcpy( &((&kk)->ctest), &((&tt)->ctest), sizeof(testt));//取地址就不会死机了
野指针导致的死机
举例:
typedef struct T
{
char *name;
int num;
}test;
test *p = (test*)k_malloc(sizeof(test));
strcpy(p->name,"jim");//这个时候的name是一个野指针,赋值会死机
k_free((char *)p);
可以这样修改:
char array[10];
test *p = (test*)k_malloc(sizeof(test));
p->name = array;//给name指针指向一个实际的地址
strcpy(p->name,"jim");
k_free((char *)p);
也可以这样修改:
typedef struct T
{
char name[10];
int num;
}test;
test *p = (test*)k_malloc(sizeof(test));
strcpy(p->name,"jim");//这个时候的name是一个野指针,赋值会死机
k_free((char *)p);
最后,推荐使用strncpy()函数,这个可以防止内存溢出
k_free重复释放动态申请的内存导致死机
返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。
举例:
野指针概述:
野指针的成因主要有三种:
一、指针变量没有被初化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么让它指向合法的内存
二、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。例:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p所指的地址仍然不变
if(p != NULL) // 没有起到防错作用
strcpy(p, “world”); // 出错
三、
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
四、
三、指针操作超越了变量的作用范围。这种情况让人防不胜防。
char *p=new char[10]; //指向堆中分配的内存首地址
cin>> p;
cout<<*(p+10);> //数组长度从0-9,不会到10
四、
操作系统中出现 while(1){ break; } 会出现死机