动态内存分配

动态内存分配【重点难点】

传统数组的缺点:

1.数组长度必须事现指定,且只能是常整数,不能是变量

例子:

int a [5]; //OK

int len = 5; int a [len]; //error


2.传统形式定义的数组,该数组的内存程序员无法手动释放

数组一旦定义,系统就为该数组分配的存储空间就会一直存在,除非数组所在的函数运行结束

或者说:

在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放

 3.数组的长度不能在函数运行的过程中动态的扩充或缩小

数组的长度一旦定义,其长度就不能再更改


4.A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法再被其他函数使用

传统方式定义的数组不能跨函数使用

下面举个例子,简单说明一下传统数组的缺陷

例1:

# include <stdio.h>

void g(int * pArr)
{
	pArr[2] = 88; //pArr == a[2]
}

void f(void)
{
	int a[5] = {1, 2, 3, 4, 5}; // 20个字节的存储空间程序员无法手动编程释放它,
	                            //它只能在本函数运行完毕时由系统自动
	g(a);
	printf("%d\n", a[2]);
}

int main(void)
{
	f();

	return 0;
}

输出结果为:

为什么需要动态内存分配内存

动态数组很好的解决了传统数组的这4个缺陷

传统数组也叫静态数组

 

动态的分配内存,就要用到malloc函数,malloc是 memory(内存)allocate(分配)的缩写

下面举个例子

例2:

# include <stdio.h>
# include <malloc.h>  //不能省

int main(void)
{
	int i = 5;  //分配了4个字节 静态分配  6行
	int * p = (int *)malloc(sizeof(int));    //7行
	
	*p = 5;  // *p 代表的就是一个int型变量,只不过*p这个整型变量的内存分配方式和7行的i的分配方式不同
	free(p);  //free(p)表示把p所指向的内容给释放掉  p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时,由系统自动释放
	printf("同志们好!\n");

	return 0;
}

输出结果为:


注意:

1、要使用malloc函数,必须添加malloc.h这个头文件

2、malloc函数只有一个形参,并且形参是整型

3、4表示请求系统为本程序分配4个字节

4、malloc函数只能返回第一个字节的地址

5、7行分配了8个字节,p变量占8个字节,p所指向的内存也占8个字节

6、p本身所占的内存是静态分配的,p所指向的内存是动态分配的


再举一个例子

例3:

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

void f(int * q)
{
//	*p = 200;  //error
//	q = 200;  //error
//  **q = 200; //error
	*q = 200; 
//	free(q);  //把q所指向的内存释放   本语句必须注释掉  否则会导致第20行代码出错
} 

int main(void)
{
	int * p = (int *)malloc(sizeof(int));  //sizeof(int)返回值是int所占的字节数
	*p = 10;

	printf("%d\n", *p);  //10
	f(p);     //p是int * 类型
	printf("%d\n", *p);  //200        20行
	
	return 0;
}
输出结果为:

静态内存和动态内存的比较

静态内存是有系统自动分配,由系统自动释放

静态内存是在栈中分配的


动态内存是由程序员手动分配,手动释放

动态内存是在堆中分配的


下面是一个动态一维数组的构造

例4:

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

int main(void)
{
	int a[5];  //如果int占4个字节的话,则本书组总共包含有20个字节,每四个字节被当做了一个int变量来使用
	int len;
	int * pArr;
	int i;
	
	//动态构造一维数组
	printf("请输入你要存放的元素的个数:");
	scanf("%d", &len);
	pArr = (int *)malloc(sizeof(int) * len);  // 14行      本行动态的构造了一个一维数组,该一维数组的长度是1en,数组名是pArr,该数组的每个元素是int类型       类似于intpArr[len]
	//对一维数组进行操作  如:对一维数组进行赋值
	for(i=0; i<len; ++i)
		scanf("%d", &pArr[i]);
	
	//对一维数组进行输出
	printf("一维数组的内容是:\n");
	for(i=0; i<len; ++i)
		printf("%d\n", pArr[i]);
	
	free(pArr);  //释放掉动态分配的数组
	
	return 0;
}

输出结果为:



【所有代码均在windows系统下VC++6.0下运行通过】

(如有错误,敬请指正)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值