谈谈内存分配与动态内存分配

内存分配
程序在内存中是分段存储的。
代码段:存放语句转换的二进制代码;程序运行时不可修改;
全局段(静态存储区):用来记录全局变量和静态变量的存储位置;不会随着程序的运行而改变;
栈:由编译器自动分配释放,存放局部变量,块变量,形式参数和返回值的存储位置;随着程序的运行其大小将不断改变;函数调用时,开辟空间,函数调用结束收回其空间;不同调用函数之间遵循后进先出的原则。
堆:存放动态分布的存储位置;一般由程序员分配释放,通过调用free函数释放内存,若不释放,程序可能由OS操作系统回收。
BSS段:存放未初始化的全局变量一块内存区域,BSS段属于静态内存分配。

一.传统数组(静态数组)的缺点

1.数组的长度必须事先指定,并且是常整数;不能是变量int a[5];
2.传统数组内存无法由程序员释放,只能由系统释放。(并且只能在数组所在函数结束后才能释放)。
3.数组的长度在函数运行期间不能动态的扩充和缩小
4.A函数定义的传统数组,在A函数结束后,在B函数中是不能使用的,因为已经释放。也就是传统数组不能跨越函数。
区分:静态存储与内存的静态开辟
二.为什么要动态分配内存
用来解决传统数组的四个缺陷
举个例子,用静态数组来存储一个班级学生,大概60人,暂且定义数组长度为60,班级同学留级,则人数较少,数组长度不能改变,这时大量分配的内存地址变造成了浪费。若班级新来同学,,又会出现内存分配不足的情况,通常把这种情况叫做溢出。
这时动态内存分配便可以解决这个问题。
动态内存分配用多少,使用多少。根据你使用的的数据大小来分配内存。
有如下优点:
1.不会造成内存浪费
2.能够随时增加,减少

三.动态内存分配举例

方法:通过malloc 函数,在堆开辟空间
1.malloc 是由程序员在堆栈动态开辟空间
2.返回值开辟空间的首地址,但是类型是void *,需要强制类型转换
3.*分配的内存空间应该能整除类型所占的字节数
4.包含头文件malloc.h
5.只能用free(p)来释放p所指的动态开辟的内存空间
6.堆动态内存空间的操作,用 *p来操作。

#include <stdio.h>
#include <malloc.h>

int main(argc ,char *argc[])
{
int len;
scnaf("%d\n",&len);
int *p=(int *) malloc (len *4);
for (int i=0;i<len;i++)
p[i]=i;
for (int i=0;i<len;i++)
printf("%d\n",p[i]);
free (p);
return 0;
}

四、静态内存和动态内存的比较
静态开辟的内存:在栈中开辟,由编译器分配,由系统自动释放
动态分配的内存:在堆中开辟,由程序员开辟,由程序员自动释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值