面试题答案
一键面试1. 内存管理
- 堆内存:由程序员手动管理,需要使用
malloc
、free
等函数进行分配和释放。如果忘记释放,会导致内存泄漏。 - 栈内存:由系统自动管理,函数执行结束时,栈上的变量会自动被销毁。
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
变量被销毁。