【C语言笔记3】内存管理

内存管理

作用域与生命周期

**作用域(可见性)**指标识符能够被使用的范围;只有在作用域内标识符才可以被使用。

生命周期指的是标识符从程序开始运行时被创建,具有存储空间,到程序运行结束时消亡,释放存储空间的时间段。此阶段针对的是程序的执行过程

(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()使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值