int a=123;//放到栈区
int *p;
p=&a;//这是执行的  放到代码区





malloc 手工分配的内存是申请的堆区,归操作系统管理   若不释放可能会发生内存泄漏



char *p=NULL;//分配4个字节的内存  这在临时区  也就是栈区
p=(char *)malloc(100);//这才把p放到堆区
if(p!=NULL){free(p)};



分析:


栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值。


堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。


全局区(静态区)(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和


未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放



常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统回收。



程序代码区:存放函数体的二进制代码




规则One:在main分配的内存都可以在被调用函数中使用


规则Two:在被调用函数的栈中分配的内存 主函数不可使用  因为被调用函数结束调用就释放了  地址里就没内容了  除非放到molloc中才可使用


例如:


char *l()
{
    char buff[30];
    strcpy(buff,"asdfsadf");
    return buff;(2013编译器提示 返回局部变量或临时变量的地址  函数结束后就清空了这个函数的所有栈中的东西  返回有什么用?又取不出来)
}




这个函数一旦结束调用  buff就被清空   除非malloc     需要cstdlib



char *buff = (char*)malloc(30 * sizeof(char));

这样才是对的


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
char * kk()
{
    char *buff = (char*)malloc(30 * sizeof(char));
    //char buff[30];
    strcpy(buff, "asdfsdf");
    return buff;
}
void main123()
{
    char* b=kk();
    printf("main123kk:%c\n", b[2]);
}
int main()
{
    main123();

    getchar();
}



android 临时存储 内存中的临时存储区_内存四大区

(图片非原创)