抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Kelecn

“唯爱与科技不可辜负!”

简介:嵌入式系统的内存资源很稀缺,其内存页会更小,在嵌入式开发当中需要特别注意内存管理。

一、内存分配方式


  内存分配方式有三种:
  [1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  [2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  [3]从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释 放内存。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大 小的堆空间将会产生堆内碎块。

二、程序的内存空间


  在C语言程序中,代码是放在内存中执行的,我们大致将程序所占用的内存分为四个区域:栈区 堆区 数据区 代码区。
  一个由C/C++编译的程序占用的内存分为以下几个部分,

1、栈区(stack)

由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈。 例如:

1
2
3
void recive(int a,int b) {
int c;
}//其中,参数a,参数b和变量c都是存放在栈区,当函数执行完毕的时候,它们占有的空间自动释放。

2、堆区(heap)

一般由程序员分配释放(malloc&free), 若程序员不释放,程序结束时可能由OS(operating system)回收 。分配方式类似于链表。例如:

1
2
3
char *src;
src = (char*)malloc(4 *sizeof(char));
//动态分配内存,表示查找可用的连续4个字节内存的空间,并将该内存首地址强制转换为指向字符数据的指针赋给scr,为src这个指针变量分配4个char类型的空间。

3、数据区(全局区)

1、(文字)常量区:存放常量,一般是字符串常量。
2、静态区(static):存放全局变量和静态变量。
该区域是在程序结束后由操作系统释放。

4、程序代码区

存放函数体(类成员函数和全局函数)的二进制代码,也是由操作系统进行管理。

三、一个例子


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
char* p1[3]= {"abc","def","ghi"};
char p2[3][4]= {"123","456","789"};
char** p3= (char**)malloc( 3 * sizeof(char*));
for(i=0;i < 3;i++)
{
p3[i]= (char *)malloc ( 5 * sizeof(char));
sprintf(p3[i],"%d%d%d",i,i,i);
/*
sprintf()函数:最常见的应用之一是把整数打印到字符串中
例如:
srpintf(s,"%d",123);
输出为:"123"
输出结果不会打印在屏幕上,而是写入字符串中
*/
printf("%s\n",p3[i]);
/*
printf()函数才将结果输出到屏幕上
*/
}
free(p3);
return 0;
}

四、参考资料


C语言知识整理(3):内存管理(详细版)

C语言中一些关于内存四区的归纳

评论




博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

总访问量为 访客数为

粤ICP备2021157327号

载入天数...载入时分秒...