内存管理
作用域与生命周期
**作用域(可见性)**指标识符能够被使用的范围;只有在作用域内标识符才可以被使用。
生命周期指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的时间段。此阶段针对的是程序的执行过程
(1).局部变量的生存期是:函数被调用,分配存储空间,到函数执行结束,存储空间释放。存储.stack区。
(2).全局变量的生存期是:从程序运行前开始,到执行后结束。存储在.data区
动态生命周期变量存储在堆区.heap。
凡是在函数外定义的变量都在数据区(.data)
凡是在函数内定义的变量都在栈区(.stack)
总结:
1.auto 和 static 局部变量 在{}内def,作用域均在{}内,不同之处在于auto 生命周期仅在{},而static生命周期为整个程序
2.在{}外def的是全局变量,没有标识符,作用域和生命周期都为整个程序,但在其他文件中引用这个变量时需要使用全局变量标识符extern,如extern int a;
3.static全局变量也在函数外定义,但作用域为当前文件
4.静态函数声明:如 static int getG(void)函数的作用域为当前文件
*5.register 寄存器变量,作用域和生命周期和auto相同
动态内存分配
#include<stdlib.h>
int number;
int *a=(int*)malloc(number*sizeof(int));
//a 可以直接当数组来用
for (int i = 0; i < number; i++)
{
scanf("%d",&a[i]);
}
for (int j = 0; j < number; j++)
{
printf("%d",a[j]);
}
free(a); //使用完后要归还这片区域
void *malloc(size_t size)
内存布局
程序没有加载到内存前,可执行程序内部已经分好 3 段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把 data 和 bss 合起来叫做静态区或全局区)。
代码区存放CPU的执行指令。代码区通常是只读的,防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息
数据区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)
未初始化数据区存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)
程序在加载到内存前,代码区和全局区(data 和 bss)的大小就是固定的,程序运行期间不能改变
void *memset(void *s,int c,size_t n)
void *memcpy(void *dest,const void *src,size_t)
等函数用于通过内存操作字符串(string.h)
memset()
常常配合malloc()
使用