C语言中堆区栈区的区别

平常我们在编程代码的过程中,经常使用的是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;  
}  

运行结果:


猜你喜欢

转载自blog.csdn.net/jie1024539775/article/details/79550351