内存操作经典问题1
野指针
- 指针变量中的值是非法的内存地址,进而形成野指针
- 野指针不是NULL指针,是指向不可用内存地址的指针
- NULL指针并无危害,很好判断,也很好调试
- C语言中无法判断一个指针所保存的地址是否合法
野指针的由来
- 局部指针变量没有被初始化
- 指针所指向的变量在指针之前被销毁
- 使用已经释放过的指针
- 进行了错误的指针运算
- 进行了错误的强制类型转换
例子1:野指针的实例
#include<stdio.h>
#include<malloc.h>
int main()
{
int* p1 = (int*)malloc(40);
int* p2 = (int*)1234567; // p2是一个野指针
int i = 0;
for(i=0;i<40;i++)
*(p1+i) = 40-i; // 由于指针运算产生了野指针,改写了非法的内存地址
free(p1);
printf("%p..\n",p); // 使用已经释放了的空间
for(i=0;i<40;i++)
p1[i] = p2[i];
return 0;
}
基本原则
- 绝不返回局部变量和局部数组的地址
- 任何变量在定义后必须0初始化
- 字符数组必须确认0结束后才能成为字符串
- 任何使用与内存操作相关的函数必须指定长度信息
小结
- 内存错误是实际产品开发中最常见的为题,而绝大多数的bug都可以通过遵循基本的编程原则和规范来避免