空指针和野指针
空指针------》不允许向NULL和非法地址拷贝内存
野指针
1、未初始化指针
2、malloc后也free了,但是指针没有置空
3、指针操作超越变量作用域
空指针可以释放 ,但是野指针不可以释放
测试源码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1、空指针 不允许向NULL和非法地址拷贝内存
void test01()
{
//char *p = NULL;
给p指向的内存区域拷贝内容
//strcpy(p, "1111"); //err
//char *q = 0x1122;
给q指向的内存区域拷贝内容
//strcpy(q, "2222"); //err
}
int * doWork()
{
int a = 10;
int * p = &a;
return p;
}
//2、野指针
void test02()
{
//int * p; //1、未初始化指针
//printf("%d\n", *p);
//2、malloc后也free了,但是指针没有置空
//int * p = malloc(sizeof(int));
//*p = 100;
//free(p); //野指针
//p = NULL; //将free后的指针要进行置空,防止野指针的出现
//printf("%d\n", *p);
//3、指针操作超越变量作用域
int *p2 = doWork(); //p2就是野指针,因为该函数调用完毕后已经收回了其栈空间
printf("%d\n", *p2);
printf("%d\n", *p2);
printf("%d\n", *p2);
}
void test03()
{
int * p = NULL;
free(p); //空指针是可以释放的
free(p);
free(p);
int * p2 = malloc(4);
free(p2);
//free(p2); //野指针是不可以释放的
}
int main(){
test01();
test02();
test03();
system("pause");
return EXIT_SUCCESS;
}
测试结果
实际测试需要打开对应的内容进程实际测试才能真正理解出错了,出现错误的原因在哪里,这样才可以明白空指针与野指针的含义,也就可以在自己做代码的时候避免这种状况。
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
//野指针产生的原因
//指针变量和它所指向的内存空间变量是两个不同的概念
// 释放了指针所致的内存空间 但是指针变量本身没有重置成NULL
//造成释放的时候 通过if (p1 != NULL)
//避免方法: 1)定义指针的时候,初始化成NULL
// 2)释放指针所指向的内存空间后,把指针重置成NULL。
int main(int argc, const char * argv[])
{
char *p1 = NULL;
p1 = (char *)malloc(100);
if (p1 == NULL)
{
return ;
}
strcpy(p1, "11112222");
printf("p1:%s \n", p1);
if (p1 != NULL)
{
free(p1);
p1 = NULL;
}
if (p1 != NULL)
{
free(p1);
}
return 0;
}