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

📅  最后修改于: 2023-12-03 14:49:14.590000             🧑  作者: Mango

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

1. 什么是野指针?

野指针是指未初始化或已经释放的指针,它指向一块未知或已经释放的内存区域。使用这样的指针访问内存区域会导致不可预料的后果,如程序异常终止、数据不一致等。

以下是一个野指针的示例:

void foo() {
    int* p;
    *p = 10;
}

在上述示例中,指针变量 p 没有初始化,它指向内存中的任意位置,执行赋值操作 *p = 10 导致未知的内存区域被修改,这可能会导致程序崩溃。

2. 如何避免野指针?
2.1 初始化指针

为指针分配内存并初始化它们是避免野指针的最好方法。可以使用 malloccallocnew 等函数为指针分配内存。

int main() {
    int* p = (int*)malloc(sizeof(int));
    *p = 10;
    // do something...
    free(p);
    return 0;
}
2.2 规范指针的生命周期

确保使用指针时,它们指向的内存块已经被分配且尚未被释放。使用指针之前要确保它们已经被初始化;在释放指针所指向的内存块之前,要确保所有使用该指针的操作已经完成。

int main() {
    int* p = (int*)malloc(sizeof(int));
    if (p != NULL) {
        *p = 10;
        // do something...
        free(p);
    }
    return 0;
}
2.3 防止指针悬挂

指针悬挂是指指针仍然指向已经被释放的内存块,这会导致无法预测的行为。为了避免指针悬挂,应当在释放指针所指向的内存块之后,将其置为 NULL

int main() {
    int* p = (int*)malloc(sizeof(int));
    if (p != NULL) {
        *p = 10;
        // do something...
        free(p);
        p = NULL;
    }
    return 0;
}
3. 总结

野指针是程序员在编写代码时经常遇到的问题,它容易导致程序崩溃、数据损坏等严重后果。要避免野指针,需要正确初始化指针、规范指针的生命周期、防止指针悬挂等。只有遵循这些规则,才能保证代码的正确性和稳定性。