内存操作经典问题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都可以通过遵循基本的编程原则和规范来避免
posted @ 2018-06-22 14:25  烟云123  阅读(223)  评论(0编辑  收藏  举报