一、程序运行为什么需要内存?基本概念?
内存是程序运行的立足之地,程序需要用内存来存储一些变量。
内存管理最终是由操作系统完成的,内存在本质上是一个硬件器件,由硬件系统提供;内存由操作系统统一管理,为了管理内存方便,操作系统提供了很多机制来让我们应用程序使用内存。这些机制彼此不同,各有各的特点,我们程序根据自己的实际情况来分配内存(暂时获得内存的使用权),使用内存,释放内存(向操作系统归还内存使用权限)。在C语言中获得内从的方法为栈、堆、数据区
二、栈
在C语言中,局部变量是存在于栈中的,栈是一段有限的内存空间。栈是自动分配自动收回,不需要程序员干预,方便简单。
反复使用:栈内存其实是一段固定空间的存储块,程序反复使用这块空间。我们要注意不能函数中返回一个局部变量的地址,因为内存是暂时的,后面会被覆盖掉。
#include<stdio.h> int *Fun(void) { int a = 2; return &a; } void Fun1(void) { int b = 5; int c = 6; } int main() { int *P; int *P1; P = Fun(); printf("a = %d ",*P); Fun1(); Fun1(); printf("a = %d ",*P); return 0; }
这段程序输出如下所示:
我们只要铭记在函数中不能返回局部变量的地址就不会犯这个错误了。
脏内存:内存空间反复使用,每次使用完成后程序都不会去清理,因此分配时保留了原来的值,我们要注意在定义局部变量时一定要进行初始化。
栈会溢出:因为栈的大小是固定的,如果超过这个内存大小,便会溢出。
#include<stdio.h> void stack_overflow(void) { int a[10000000] = {0}; a[10000000-1] = 12; } int main() { stack_overflow(); return 0; }
#include<stdio.h> void stack_overflow2(void) { int a = 2; stack_overflow2(); } int main() { stack_overflow2(); return 0; }
这两个代码都会导致栈溢出。