MST
星途 面试题库

面试题:C语言中堆内存与栈内存的区别

在C语言里,堆内存和栈内存用于不同的目的。请阐述它们在内存管理、分配方式、生命周期以及作用域等方面的主要区别,并举例说明何时使用堆内存分配,何时使用栈内存分配。
37.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

1. 内存管理

  • 堆内存:由程序员手动管理,需要使用 mallocfree 等函数进行分配和释放。如果忘记释放,会导致内存泄漏。
  • 栈内存:由系统自动管理,函数执行结束时,栈上的变量会自动被销毁。

2. 分配方式

  • 堆内存:在程序运行期间动态分配,从堆空间中获取内存。例如 int *ptr = (int *)malloc(sizeof(int));
  • 栈内存:在函数调用时,系统为函数的局部变量在栈上分配内存空间。例如 int num = 10;num 变量在栈上分配。

3. 生命周期

  • 堆内存:只要程序员不释放,它就一直存在于内存中,直到程序结束。
  • 栈内存:随着函数的调用而创建,函数结束时被销毁。

4. 作用域

  • 堆内存:没有像栈内存那样严格的函数作用域限制,只要有指向堆内存的指针,在程序任何地方都可以访问。
  • 栈内存:一般局限于定义它的函数内部,函数结束,栈变量就无法访问。

5. 何时使用

  • 堆内存分配:当需要动态分配较大的内存空间,或者需要在函数调用结束后仍然保留数据时使用。例如,实现一个动态增长的数组,就需要使用堆内存分配。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    printf("请输入数组元素个数: ");
    scanf("%d", &n);

    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    free(arr);
    return 0;
}
  • 栈内存分配:对于占用空间较小,且生命周期只在函数内部的变量,使用栈内存分配。比如函数内部的临时变量,计算两个数之和:
#include <stdio.h>

int add(int a, int b) {
    int sum;
    sum = a + b;
    return sum;
}

int main() {
    int num1 = 3, num2 = 5;
    int result = add(num1, num2);
    printf("两数之和为: %d\n", result);
    return 0;
}

在这个例子中,sum 变量在 add 函数的栈上分配,函数返回后,sum 变量被销毁。