MST

星途 面试题库

面试题:C语言指针与内存管理基础

请解释C语言中指针的定义,并说明如何通过指针动态分配一块内存,最后释放这块内存。同时,分析在这个过程中如果内存释放不当可能会导致什么问题。
24.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 指针的定义

    • 在C语言中,指针是一种变量,它存储的是另一个变量的内存地址。例如,int *ptr; 这里定义了一个名为 ptr 的指针变量,它可以指向 int 类型的变量。* 符号在这里用于声明 ptr 是一个指针。
  2. 通过指针动态分配内存

    • 使用 malloc 函数来动态分配内存。malloc 函数在堆上分配指定字节数的内存,并返回一个指向分配内存起始地址的指针。如果分配失败,返回 NULL。例如:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *ptr;
        ptr = (int *)malloc(sizeof(int));
        if (ptr == NULL) {
            printf("内存分配失败\n");
            return 1;
        }
        *ptr = 10;
        return 0;
    }
    
    • 在上述代码中,malloc(sizeof(int)) 分配了足够存储一个 int 类型数据的内存空间,并将返回的指针强制转换为 int * 类型,赋值给 ptr。然后通过 *ptr 对分配的内存进行赋值。
  3. 释放内存

    • 使用 free 函数来释放通过 malloc 分配的内存。例如:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *ptr;
        ptr = (int *)malloc(sizeof(int));
        if (ptr == NULL) {
            printf("内存分配失败\n");
            return 1;
        }
        *ptr = 10;
        free(ptr);
        ptr = NULL;
        return 0;
    }
    
    • 调用 free(ptr) 释放 ptr 所指向的内存空间,之后将 ptr 赋值为 NULL,防止出现野指针。
  4. 内存释放不当导致的问题

    • 内存泄漏:如果忘记调用 free 函数释放动态分配的内存,这块内存将一直被占用,直到程序结束。随着程序中不断地动态分配内存而不释放,可用内存会越来越少,最终可能导致系统内存耗尽,程序崩溃。例如:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *ptr;
        for (int i = 0; i < 1000000; i++) {
            ptr = (int *)malloc(sizeof(int));
            // 这里没有调用 free(ptr)
        }
        return 0;
    }
    
    • 野指针:如果在调用 free 之后没有将指针赋值为 NULL,该指针就成为野指针。野指针指向的内存已经被释放,再次使用这个指针可能导致未定义行为,例如程序崩溃或数据损坏。例如:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *ptr;
        ptr = (int *)malloc(sizeof(int));
        *ptr = 10;
        free(ptr);
        // 这里没有将 ptr 赋值为 NULL
        printf("%d\n", *ptr); // 未定义行为
        return 0;
    }
    
    • 多次释放:对同一块已经释放的内存再次调用 free 函数,也会导致未定义行为。例如:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        int *ptr;
        ptr = (int *)malloc(sizeof(int));
        free(ptr);
        free(ptr); // 多次释放,未定义行为
        return 0;
    }