📜  什么是野指针?我们如何避免?(1)

📅  最后修改于: 2023-12-03 15:06:28.119000             🧑  作者: Mango

什么是野指针?如何避免?

什么是野指针?

在程序中,指针指向的地址可能被释放或者没有被初始化的指针,就被称作野指针。如果我们尝试使用一个野指针,就会导致程序崩溃或者产生严重的安全问题。野指针通常出现在以下情况下:

  • 指针变量没有初始化
  • 指针指向的内存已经被释放
  • 指针越界或者指向不存在的内存地址
如何避免野指针?

避免野指针可以说是程序员的基本素养之一,下面是一些常见的避免野指针的方法:

  1. 初始化指针

在使用指针之前,应该先为它分配内存或者初始化为 NULL,以确保指针指向的地址是有效的。

int *p = NULL;

p = malloc(sizeof(int));
if (p == NULL) {
  // 处理内存分配失败的情况
} else {
  // 在使用 p 之前,必须为它分配内存或者初始化为 NULL
}
  1. 清空指针

在指针的生命周期结束之后,应该将其设为 NULL,以避免出现野指针。特别是在涉及到多级指针的时候,很容易出现漏洞。

int **pp = NULL;

pp = malloc(sizeof(int *));
if (pp == NULL) {
  // 处理内存分配失败的情况
} else {
  *pp = malloc(sizeof(int));
  if (*pp == NULL) {
    // 处理内存分配失败的情况
  } else {
    // 在使用 pp 和 *pp 之前,必须为它们分配内存或者初始化为 NULL
    *pp = NULL;
    free(pp);
  }
}
  1. 确定指针指向的内存已经分配

在使用指针之前,必须确保指针指向的内存已经分配,如果未分配那么就可以用 malloc() 或者 calloc() 函数分配内存。

int *p = NULL;

p = malloc(sizeof(int));
if (p == NULL) {
  // 处理内存分配失败的情况
} else {
  // 在使用 p 之前,必须为它分配内存或者确保指向的内存已经分配
}
  1. 避免使用已经释放的内存

在使用指针之前,必须确保指向的内存已经被分配,当不需要使用指针所指向的内存时,需要将它释放并设置为 NULL,以免出现野指针问题。

int *p = NULL;

p = malloc(sizeof(int));
if (p == NULL) {
  // 处理内存分配失败的情况
} else {
  // 在使用 p 之前,必须为它分配内存或者确保指向的内存已经分配
  // 处理完 p 所指向的内存后,需要将它释放并设置为 NULL
  free(p);
  p = NULL;
}
  1. 不要将指针指向不存在的内存地址

在使用指针之前,必须确定指针指向的地址是存在的,否则就可能出现野指针的问题。这种情况通常出现在指针越界或者使用非法地址时。

int a[10] = {0};
int *p = NULL;

// 在使用指针之前,必须确定指针指向的地址是存在的
if (p >= a && p < a + 10) {
  // 在合法的范围内,p 指向的地址是存在的
} else {
  // 指针越界或者指向不存在的内存地址
}
总结

以上是避免野指针的常见方法,虽然避免野指针会降低程序的开发效率,但是避免野指针是非常必要的,能够提高代码的可靠性和安全性,并减少调试和排查问题的时间。所以程序员应该养成良好的编程习惯,避免野指针的出现。