堆区
- 堆区由程序员管理,修改它的手段非常宽松
- 在C语言中,变量的分配和释放使用类似malloc()和free()之类的函数
- 堆区非常大,通常受限于可用的物理内存
- 堆区需要使用指针访问
char* p = (char*)malloc(sizeof(10));
//堆区空间申请,申请10字节的空间
//成功申请空间时,函数的返回值便是堆区空间的首地址
代码示例
字符数组
#include <stdio.h>
#include<stdlib.h>
int main() {
int n;
scanf("%d", &n);
char* str = (char*)malloc(sizeof(char) * (n+1));//'\0';
getchar();//抵制空格
gets(str);
printf("%c", str[3]);
free(str);//释放
return 0;
}
全局变量
int n;//全局变量函数外定义,默认初始化为0
//全局变量和局部变量可以重名,局部变量大于全局变量
//局部变量不会被默认初始化
代码示例
#include <stdio.h>
#include<stdlib.h>
int a = 5, b = 7;
void hh(int a, int b) {
printf("%d ", a++ && ++b);
}
int main() {
int a = 3, b = 5;
hh(a, b);//值传递,本身的a,b,不发生变化。
printf("%d %d", a, b);
return 0;
}
//全局变量声名
extern int a;
静态局部变量
特点
- 1)在修饰变量的时候,static 修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
- (2)static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。
- (3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为 0。
- (4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用 static 修饰。
- (5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。
- 全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。
- 全局变量存储,在程序的整个生命周期都存在
栈区
特点
局部变量存储(自动,连续的内存)栈用来存储函数内部的变量(包括main()函数)。
- 栈由CPU管理,无法修改
- 变量自动地分配和释放
- 栈并非没有限制,大部分栈都由一个上边界
- 栈随着变量地产生和销毁生长和收缩
- 栈区变量只有在函数创建它们地时候存在