指针悬挂:
指针在释放之后,没有设置为NULL。使得指针仍然指向原地址。
多个指针指向同一对象时,释放其中一个指针,并设置为null,其他的指针仍然成为了悬挂指针。
危 害:通过悬挂指针读写内存,信息泄露
代码测试实例:
#include<stdio.h>
#include<malloc.h>
int main()
{
int *p1=(int*)malloc(sizeof(int));
int *p2,*p3;
printf("address p1 point to:%x",p1); //输出 指针p1所指向的内存地址 假设为:0x00318b50
*p1=618; //给p1所指的内存地址赋值
printf("\n*p1 value:%x",*p1); //输出p1所指的内存地址中存储的数据 即618(dec)
p2 = p1; //指针p2指向p1所指的内存地址,即多指针指向同一对象
printf("\naddress p2 point to:%x",p2); //输出 指针p2所指向的内存地址,也为:0x00318b50
free(p1); //释放指针p1
printf("\nfree p1\n");
printf("\naddress p1 point to:%x",p1); //此时p1即为悬挂指针 即使释放了仍然可以正常输出指针p1所指向的内存地址:0x00318b50
printf("\naddress p2 point to:%x",p2); //同时p2也成为悬挂指针 输出 指针p2所指向的内存地址,也为:0x00318b50
p1=NULL; //设置p1为空
// printf("\n set p1 with null\n");
printf("address p2 point to:%x",p2); //此时,p2仍然为悬挂指针 输出 指针p2所指向的内存地址,也为:0x00318b50
p3=(int*)malloc(sizeof(int)); //分配一个int 4字节的空间。并由指针p3指向次内存空间
*p3=22; //给p3所指的内存地址赋值
printf("\naddress p3 point to:%x",p3); //输出 指针p3所指向的内存地址 此时,系统将刚才所释放的p1原指向的内存空间分配给了p3,即内存地址:0x00318b50
printf("\n*p2 value:%x",*p2); //此时测试输出p2指向的内存地址的值:22,即为p3指向的内存地址的值(内存信息泄露)
printf("\n*p1 value:%x",*p1); //此时测试输出p1指向的内存地址的值。由于p1被设置为null,已经不能被使用,因此此处会引起程序异常终止。
return 0;
}
指针在释放之后,没有设置为NULL。使得指针仍然指向原地址。
多个指针指向同一对象时,释放其中一个指针,并设置为null,其他的指针仍然成为了悬挂指针。
危 害:通过悬挂指针读写内存,信息泄露
代码测试实例:
#include<stdio.h>
#include<malloc.h>
int main()
{
int *p1=(int*)malloc(sizeof(int));
int *p2,*p3;
printf("address p1 point to:%x",p1); //输出 指针p1所指向的内存地址 假设为:0x00318b50
*p1=618; //给p1所指的内存地址赋值
printf("\n*p1 value:%x",*p1); //输出p1所指的内存地址中存储的数据 即618(dec)
p2 = p1; //指针p2指向p1所指的内存地址,即多指针指向同一对象
printf("\naddress p2 point to:%x",p2); //输出 指针p2所指向的内存地址,也为:0x00318b50
free(p1); //释放指针p1
printf("\nfree p1\n");
printf("\naddress p1 point to:%x",p1); //此时p1即为悬挂指针 即使释放了仍然可以正常输出指针p1所指向的内存地址:0x00318b50
printf("\naddress p2 point to:%x",p2); //同时p2也成为悬挂指针 输出 指针p2所指向的内存地址,也为:0x00318b50
p1=NULL; //设置p1为空
// printf("\n set p1 with null\n");
printf("address p2 point to:%x",p2); //此时,p2仍然为悬挂指针 输出 指针p2所指向的内存地址,也为:0x00318b50
p3=(int*)malloc(sizeof(int)); //分配一个int 4字节的空间。并由指针p3指向次内存空间
*p3=22; //给p3所指的内存地址赋值
printf("\naddress p3 point to:%x",p3); //输出 指针p3所指向的内存地址 此时,系统将刚才所释放的p1原指向的内存空间分配给了p3,即内存地址:0x00318b50
printf("\n*p2 value:%x",*p2); //此时测试输出p2指向的内存地址的值:22,即为p3指向的内存地址的值(内存信息泄露)
printf("\n*p1 value:%x",*p1); //此时测试输出p1指向的内存地址的值。由于p1被设置为null,已经不能被使用,因此此处会引起程序异常终止。
return 0;
}