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();
}
(图片非原创)