MST

星途 面试题库

面试题:C语言非法指针引发的内存问题

假设你有一个C程序,在函数内部动态分配了一块内存,之后不小心产生了非法指针,导致程序出现内存泄漏和段错误。请分析可能产生非法指针的原因,并提出至少两种解决方案来修复这个问题。
29.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

可能产生非法指针的原因:

  1. 指针未初始化:声明指针后,没有为其分配内存就直接使用,例如int *ptr; *ptr = 10; ,这里ptr未初始化,是一个非法指针。
  2. 内存释放后继续使用:调用free函数释放内存后,没有将指针设置为NULL,导致继续使用已释放的内存,例如int *ptr = (int *)malloc(sizeof(int)); free(ptr); *ptr = 10; ,释放后ptr指向的内存已无效,但仍在使用。
  3. 数组越界:访问数组时超出数组的有效范围,例如int arr[5]; int *ptr = &arr[10];arr[10]超出了数组arr的范围,ptr成为非法指针。
  4. 函数返回局部变量指针:函数内定义局部变量,返回指向该局部变量的指针,函数结束时局部变量销毁,指针指向无效内存,例如:
int *func() {
    int num = 10;
    return #
}

解决方案:

  1. 初始化指针:在声明指针后,立即为其分配内存或设置为NULL。例如int *ptr = NULL; ptr = (int *)malloc(sizeof(int)); ,先初始化为NULL,再分配内存,避免使用未初始化指针。
  2. 释放后设为NULL:调用free释放内存后,将指针设置为NULL。例如int *ptr = (int *)malloc(sizeof(int)); free(ptr); ptr = NULL; ,这样后续使用ptr时,由于是NULL指针,可避免访问已释放内存导致的问题。
  3. 避免数组越界:在访问数组元素时,确保索引在有效范围内。可以通过循环条件等方式控制,例如:
int arr[5];
for (int i = 0; i < 5; i++) {
    // 安全访问arr[i]
}
  1. 返回动态分配内存的指针:如果函数需要返回一个指针,改为返回动态分配内存的指针,调用者负责释放内存。例如:
int *func() {
    int *ptr = (int *)malloc(sizeof(int));
    *ptr = 10;
    return ptr;
}
int main() {
    int *result = func();
    // 使用result
    free(result);
    return 0;
}