内存分配的类型:
静态内存分配:
全局变量、静态全局变量、静态局部变量; 静态内存分配是在程序编译时分配的内存空间
-
全局变量
#include <stdio.h> int a; int main() { printf("%d\n"); return 0; }
在函数和代码块外部定义的变量是全局变量
定义一个全局变量时,变量在程序编译时就分配内存空间。全局变量可以在其他文件中访问时要加上extern 关键字。在一处值发生改变其他文件中在使用时就会发生改变
-
静态全局变量
在变量类型前加static
#include<stdio.h>
static double hp = 100;
int main ()
{
printf("%d\n", hp);
return 0;
}
静态全集变量只能在当前文件的所有函数中被使用,其他文件中没法使用。但可以定义一个名字相同的变量
-
静态局部变量
在局部变量前加static 关键字,静态局部变量的生命周期是从声明到程序结束的
动态内存分配:
局部变量:栈和堆;变量在程序运行时分配内存
栈
栈的特点是:先进后出。
栈内存空间由计算机自动分配和回收。生命周期在函数块内部,函数块执行结束,这块内存就自由了,可以让其他变量访问(内存里的内容在其它变量调用之前不会改变。
堆
堆空间是由程序员手动开辟的内存空间。程序员不释放这块空间,它就不能让其他变量访问。
堆空间分配的变量没有变量名,只能通过指针间接访问堆空间里的内容。
静态存储区
变量前面加static声明后,这块空间就被计算机分配到静态存储区中,生命周期是从声明到程序退出。
static 声明的变量在程序编译时就分配空间。
例:如何释放函数里面的malloc申请的堆空间
#include <stdio.h>
#include <stdlib.h>
int *a = NULL;
int *add()
{
a = (int *)malloc(sizeof(int));
*a = 8;
return a;
}
int main(int argc, const char * argv[])
{
add();
printf("%d\n", *a);
free(a);
return 0;
}
int *p = (int *)malloc(sizeof(int));//因为malloc 返回值是void *,需要进行类型转化,才能把值赋值给其他指针变量