动态内存

局部变量分配在栈中,该区域在windows平台默认为1M,

动态分配的内存在堆中,该区域非常大,在windows平台默认大于1.2G

使用动态内存的情况:1.需要通过变量定义数组   2.需要定义大容量的数组

创建动态内存:对内存的动态分配及释放时通过系统提供的库函数来实现的,主要有malloc,calloc,realloc,free这四个函数

怎样建立内存的动态分配:

1.malloc:函数原型   void *malloc(unsigned int size); 

在内存的动态存储区中分配一个长度为size字节的连续空间       返回值为:     成功时:动态内存的首地址     失败时:NULL

malloc(100)    申请100字节的动态内存,注意函数的返回值为void *,即不指向任何特定类型的数据,只提供一个地址

如果此函数未能成功的执行(例如内存空间不足),则返回空指针(NULL)

2.calloc函数:其函数原型为void *calloc(unsigned n,unsigned size);

该函数会将内存的所有字节初始化为0,该函数完全可以被malloc替代

3.realloc:其函数原型为void *realloc(void *p,unsigned int size);

调整原申请的动态内存的大小,P是原动态内存的地址,size新的内存大小,以字节为单位。

必须接收新的返回值。

4.free函数:其函数原型为:void free(void *p);

释放指针变量p所指向的动态内存,

思考:为什么free函数不需要长度信息???参考:https://blog.youkuaiyun.com/caogenwangbaoqiang/article/details/79834150

申请内存块的时候,会有一种机制去记录内存块的大小,各个编译器的做法可能不同,比如申请的时候多分配4个字节,用来存储整个内存块的大小。所以在free()的时候只需要传指针,不需要传大小。

free释放的是指向指针的内存,内存!!!不是指针!指针是一个变量,在程序结束时才会被销毁,释放了内存空间后,原来指

向这块空间的内存还是存在,只不过现在指向的那块内容是垃圾,是未定义的,所以说是垃圾,

创建内存:

1.都是以字节为单位,注意乘以sizeof(类型)

2.realloc函数一定要接收返回值,不能使用原地址

free()崩溃的原因:

1.越界       2.移动指针指向      3.重复释放同一段内存

函数指针:函数的指针     如果在函数中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起

始地址,称为这个函数的指针。

int  (* p)(int ,int);

根据优先级p是一个指针,它指向一个函数,这个函数需要两个整型作为形参,一个整型作为返回值。

C语言规定:函数名本身也表示函数的地址,即Max等同&max

那么p=&max;可以写成p=Max;

那么(*p)(10,20);可以写成p(10,20);

变量和内存:

全局变量:定义在函数外面的变量,尽量少使用。

局部变量:定义在函数内部的变量,包括形参。

static:静态关键字,可以用来修饰全局变量,局部变量(不能修饰形参)和函数。

 生命周期 作用域默认值     内存区域链接属性
 静态全局变量

程序运行时创建

程序退出时销毁

整个文件      0全局(静态)变量区  内部的
 普通全局变量程序运行时创建程序退出时销毁整个文件      0全局(静态)变量区  外部的
 静态局部变量进入函数时创建程序退出时销毁函数内部      0全局(静态)变量区      无
 普通局部变量进入函数时创建函数结束时销毁函数内部  随机值           栈      无
    动态内存调用创建函数创建,调用释放函数销毁只要能获取指针的都能用  随机值                 无
    静态函数         无整个文件     无        代码段  内部的
    普通函数         无整个文件     无        代码段  外部的

 

代码段:存放程序的代码

全局(静态)变量区:存放全局变量和静态变量

栈:存放局部变量,系统自行管理该内存,内存区域小,windows默认1M

堆:动态内存区域,内存区域大,需要由程序自行管理内存,使用后一定要释放,否则出现内存泄漏。

例:请说明下面的指针分别指向什么位置:
&p:       A      ,p:       B       &p1:     C      ,p1:          C           

&p2:       C     ,p3:       D      ,p4:          C        p5:         A         

void foo(char a)

{
static  char   nCount;

char p1[]="AAA";

char *p2="AAA";

char *p3=(char *)malloc(10);

char *p4=&a;

char *p5=&nCount;

}

void *p (char)=foo;

A:数据段(全局变量区)    B:代码段     C:栈      D:堆       E:不一定,视调用情况而定

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值