内置数组大小分配的问题

动态内存分配相对于静态内存分配的特点:

1) 静态内存分配是在编译时完成的,不需要占用CPU资源;动态分配内存是在运行时完成的,动态内存的分配与释放需要占用CPU资源;
2) 静态内存分配是在栈上分配的,动态内存是堆上分配的;
3) 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要;
4) 静态分配内存需要在编译前确定内存块的大小,而动态分配内存不需要编译前确定内存大小,根据运行时环境确定需要的内存块大小,按照需要分配内存即可。可以这么说,静态内存分配是按计划分配,而动态内存分配是按需分配。
5) 静态分配内存是把内存的控制权交给了编译器,而动态内存是把内存的控制权交给了程序员

动态分配内存具体的实现方法(两种)
在C语言的实现的方法:
(1)动态内存分配的实现及管理

要实现动态内存分配需要分配动态空间函数malloc函数。该函数的原型为:

void* malloc(unsigned int size);

其作用是在堆内存中分配一个长度为size的连续空间。返回值是一个指向所分配的连续存储域的起止地址的指针。分配一个堆内存是有风险的,如果堆内存空间不足时,该函数就会返回一个NULL指针,所以在调用该函数后应该检测返回值是否为NULL并执行相应的操作。

如: char* str = malloc(4*sizeof(char));

if(str != NULL) …..;

(2)动态内存的释放

由于堆内存的使用空间是有限的,当使用该指针结束后,就应该释放该空间的内存,以便其他的变量使用它。这就需要free函数。其函数原型是:

void free(void* p);

作用是释放指针p所指向的内存空间。指针p必须是指向malloc分配的空间,如果不是堆空间,那么会造成可怕的后果。

列如:

char* p1,*p2;

p1 = malloc(3*sizeof(char));

p2 = p1;

free(p2);

以上操作是正确的。

(3)野指针

由于动态内存分配的堆内存已经释放,该内存内的原变量已将不存在,但是该指针仍然指向这一堆内存的地址,由于不知道该堆内存不知道会存储什么内存,因此该指针被称为“野指针”。

消除野指针的方法是把该指针置为NULL。

p2 = NULL;

在C++中的实现方法:
(1)用指针创建堆空间
在C++中使用关键字new创建一个堆并分配内存。
int * p = new int;
(2)用指针删除堆中的空间
由于使用new创建的内存空间不会被系统自动释放,如果程序员不去释放,那么会导致内存泄露。
delete p;
(3)野指针
p=NULL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值