C语言中的内存管理

文章目录

  • 🍊自我介绍
  • 🍊内存分配
    • 生命周期和作用域
    • C语言运行时的内存分配
  • 🍊static关键字的使用(补充)
    • 修饰局部常量
    • 修饰全局变量
    • 修饰函数
  • 🍊堆区内存管理
    • malloc函数
    • free函数
    • memset函数
    • 程序中的运用

你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

Hello,大家好,我是小珑也要变强(也是小珑),现在我来为大家介绍一下有关嵌入式C语言方面的内容。


🍊内存分配

生命周期和作用域

**生命周期 :**变量占据内存的有效时间。(以人来说就是从出生到离去这段时间)
**作用域 :**变量出现的有效区域。

C语言运行时的内存分配

栈区 局部变量,函数的参数。只能在函数内部使用,外部不能使用
堆区 **需要手动申请/释放,**malloc申请空间,free释放空间
.data 存放已经初始化的全局变量,静态变量
.bss 存放未初始化的全局变量,静态变量
.rodata 只读数据区存放一些常量,例如字符串等
.text **存放一些可执行的代码,**例如if语句,case语句等

🍊static关键字的使用(补充)

之前讲解局部变量的时候说了一点关于static的知识,点击这里即可跳转至之前的内容

修饰局部常量

	在编译的过程中,会在数据区(.bss / .data)为该变量开辟空间,
并对其进行初始化,如果代码中未对其进行初始化,则系统默认初始化为0。
	用static修饰的局部变量,会延长局部变量的寿命,超出函数的生
存期。

修饰全局变量

	static 修饰全局变量,在数据区域分配存储空间,未初始化编译
器会自动初始化为0.
	slatic 修饰全局变量,限制全局变量的使用范围,让其只能在本
文件使用,其他文件不能使用。

修饰函数

	函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:
	1、静态函数只能在声明它的文件中可见,其他文件不能引用该函数。
	2、不同的文件可以使用相同名字的静态函数,互不影响。

🍊堆区内存管理

malloc函数

c 复制代码
 #include <stdlib.h>

void *malloc(unsigned int size)

功能:从堆区分配内存

size: 分配内存的字节数

返回值:成功 返回分配内存的首地址,失败 返回NULL

free函数

c 复制代码
#include <stdio.h>

void free(void *ptr)

功能:释放内存

size: 分配内存的字节数

返回值:成功 返回分配内存的首地址,失败 返回NULL

有malloc函数就要有free函数,否则在一些循环过程中会造成内存泄漏,而运行出错!!

memset函数

c 复制代码
#include <string.h>

void *memset(void *s,int c,size_t n);

功能:把s所有指向内存区域的前n个字节全部置为c

s: 想要操作内存区域的首地址
c: 内存区域填充的值
n: 需要填充的字节数

返回值:成功 返回s指向的地址  失败 返回NULL

程序中的运用

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 5

int *get_memory_addr() //指针函数,返回的是地址
{
	int *addr = NULL;
	addr = (int *)malloc(sizeof(int) * N);

	if(NULL = addr)
	{
		printf("malloc is fail!\n");
	}
	memset(addr,0,sizeof(int) * N);
	return addr;
}

void intput_array(int *p)
{
	int i = 0;
	printf("please input %d data:",N);
	for(i = 0;i < N;i++)
	{
		scanf("%d",p[i]);
	}
}

void output_array(int *p)
{
	int i = 0;
	for(i = 0;i < N;i++)
	{
		printf("%d",p[i]);
	}
}

int main()
{
	int *t = NULL;
	
	t = get_memory_addr();
	
	intput_array(t);
	output_array(t);

	free(t);
	t = NULL;
	
	return 0;

}
相关推荐
weixin_452600691 分钟前
【青牛科技】D1117 1.0A低压差线性稳压电路芯片介绍,可保证了输出电压精度控制在±1.5%的范围内
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·dvd 解码板
就是有点傻9 分钟前
C#中面试的常见问题005
开发语言·面试·c#·wpf
北京迅为38 分钟前
【北京迅为】iTOP-4412全能版使用手册-第七章 Android 4.4系统编译
linux·嵌入式硬件·4412开发板
一舍予1 小时前
nuxt3项目搭建相关
开发语言·javascript·vue.js·nuxt
AI人H哥会Java2 小时前
【JAVA】Java基础—面向对象编程:常用API与数据结构—集合框架(List、Set、Map等)
java·开发语言
上海合宙LuatOS2 小时前
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
人工智能·单片机·嵌入式硬件·物联网·硬件工程·iot
shepherd枸杞泡茶2 小时前
C# 数据结构之【队列】C#队列
开发语言·数据结构·c#
神仙别闹3 小时前
基于C语言实现的(控制台)校园导航系统
java·服务器·c语言
scoone3 小时前
C++中的原子操作:原子性、内存顺序、性能优化与原子变量赋值
开发语言·c++
轩情吖3 小时前
模拟实现Bash
linux·c语言·开发语言·c++·后端·bash·环境变量