文章目录
- 🍊自我介绍
- 🍊内存分配
-
- 生命周期和作用域
- 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;
}