面试题答案
一键面试NULL指针容易被错误使用的场景及避免方法
- 函数参数传递
- 场景:调用函数时,可能误将NULL指针作为参数传递给期望有效指针的函数,例如一个处理字符串的函数,若传递了NULL指针代替有效的字符串指针,可能导致程序崩溃。
- 避免方法:在函数内部对指针参数进行有效性检查,使用
if (pointer != NULL)
语句,若指针为NULL,可根据情况返回错误码或进行特殊处理,避免继续使用无效指针。
- 内存分配与释放
- 场景:在使用
malloc
等内存分配函数后,可能未检查返回值是否为NULL就直接使用,若内存分配失败(返回NULL),后续对该指针的操作会导致未定义行为。在释放内存时,可能重复释放已释放的指针,或释放NULL指针,这同样会导致未定义行为。 - 避免方法:在内存分配后立即检查返回值,如
int *ptr = (int *)malloc(sizeof(int)); if (ptr == NULL) { /* 处理内存分配失败,如输出错误信息并终止程序 */ }
。对于释放指针,在释放前检查指针是否为NULL,如if (ptr != NULL) { free(ptr); ptr = NULL; }
,释放后将指针置为NULL,防止重复释放。
- 场景:在使用
- 指针初始化
- 场景:声明指针变量后未初始化就使用,该指针可能指向任意内存地址,使用这样的“野指针”会导致未定义行为,若误将其当作NULL指针处理,也会产生错误。
- 避免方法:声明指针变量时将其初始化为NULL,如
int *ptr = NULL;
,确保指针在使用前有明确且安全的初始状态。
- 链表等数据结构操作
- 场景:在链表遍历、插入、删除操作中,若对NULL指针处理不当,例如在遍历链表时未正确判断链表结束(即当前节点指针为NULL),继续访问NULL指针指向的内存,会导致程序崩溃。
- 避免方法:在操作链表节点指针前,始终检查指针是否为NULL。在遍历链表时,使用
while (current != NULL)
的循环结构;在插入或删除节点时,仔细处理边界情况,确保不会产生对NULL指针的非法操作。