平常我们在编程代码的过程中,经常使用的是C语言,在编写代码的过程中,会有这样的思考:你的代码中数据是怎么存放的?存放在哪些地方,怎么来在STM32或者其他硬件平台上来运转?
在C语言编写代码的过程中,内存分为四区:栈区、堆区、全局变量区、代码区
1)栈区:由编译器自动分配释放,存放函数的参数,局部变量的值
void recevery(char* buf, int bufsize)
{
int size;
}
例如上面的函数void recevery(char* buf, int bufsize)的参数buf,参数bufsize和size都是存放在栈区.当函数执行完毕的时候,自动释放
2)堆区:由程序员分配释放,即动态内存的申请和释放,一般由程序员分配释放(动态内存申请与释放)----是通过malloc()函数来操作的,就是动态的申请内存。若程序员不释放,程序结束时可能由操作系统回收
char* src = (char*) malloc(sizeof(buf) * sizeof(10));
例如上面的函数中的src所指向的内存空间就是在堆区
3)全局区:全局变量和静态变量是放在一块的。初始化的全局变量和未静态变量在同一个区域,未初始化的全局变量和静态变量在相邻的另外一个区域,全局变量和静态变量存放在此. 里面细分有一个常量区(const修饰的), 字符串常量和其他常量也存放在此. 该区域是在程序结束后由操作系统释放.
4)代码区:存放函数体的二进制代码
每个程序都有唯一的四个内存区域,我们需要熟悉和了解各个区域的特性,例如存储什么类型的数据, 有谁去申请开辟, 又有谁去管理释放等问题才能真正分析你的应用程序问题出在哪里,
#include <stdio.h>
#include <malloc.h>
char *getNum1(int num)
{
char *p;
p = malloc(sizeof(int)*num);
strcpy(p,"2222233344");
return p;
}
char *getNum2(int num)
{
char buf[60];
strcpy(buf,"adcvd");
return buf;
}
int main()
{
char *temp = NULL;
temp = getNum1(10);
printf("%s\n",temp);
temp = getNum2(10);
printf("%s\n",temp);
system("pause");
return 0;
}
运行结果: