C学习记录7——内存管理

11 篇文章 1 订阅

一、静态变量

1.静态(static)局部变量

  • 作用域在定义函数内
  • 生命周期同程序运行周期(在数据区存储)
  • 值只能初始化一次,但可以赋值多次
  • 若未赋初值,则系统自动赋值(数值型0,字符型空字符)

注意:不要返回局部变量的地址,因为运行后会释放,第一次可正确返回是因为编译器保留,第二次操作就会丢失

2.静态全局变量

作用域:只可在本文件中使用,不可在其他文件使用

3.静态函数

只可在本文件中使用,不可在其他文件使用的函数

二、内存布局

1.内存分区

运行前:

  • 代码区text:程序执行二进制码(程序指令)由操作系统管理
    特点:共享(目的:对频繁被执行的程序,只要在内存中有一份代码即可)
    只读(原因:防止程序意外修改指令)
  • 数据区(全局区、静态区):程序结束后由系统释放
    数据区包含 :
    1)初始化数据区(data)
    2)未初始化数据区(bss)
    3)常量区

运行后:

  • 栈区stack:系统为每一个程序分配一个临时空间,大小为1M,Windows中可扩展到10M,Linux中可扩展到16M。先进后出,执行完后自动释放。存储局部变量、函数信息、函数参数、数组、const局部常量
  • 堆区heap:存储大数据、图片、音频等。需手动开辟(malloc/colloc、realloc)手动释放free
    1)malloc()
    void* malloc(size_t size);在堆区中分配一块长度为size字节的连续区域,分配的内存空间内容不确定,一般用memset初始化,返回分配空间的起始地址。
int* p = (int*)malloc(sizeof(int)*10);

2)free()
free(p);p为指针变量,释放其所指的空间。改变指针方向释放会出错。堆空间不可多次释放,空指针可以

2.内存操作函数

使用需#include <string.h>

1)memset()

重置内存空间的值
memset(s,c,n);
将s的内存区域的前n个字节以参数c填入(一般用于重制为0)

2)memcpy()

memcpy(dest,src,size_t n);
拷贝src所指内存内容的前n字节到dest所指的内存上
dest和src不可重叠,可能报错

3)memmove()

功能用法同memcpy(),可处理dest与drc内存空间重叠,但执行效率比memcpy()低

4)memcmp()

memcmp(s1,s2,n);
比较s1,s2所指向内存区域的前n个字节

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值