动态内存分配

动态内存分配

传统数组的缺点

  1. 数组的长度必须事先制定,且只能是常数,不能是变量
    例子:
int a[5]    //ok
int len = 5 ; int a[len]; //error
  1. 传统形式定义的数组,该数组的内存程序员无法手动释放
    (在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕,数组的空间才会被系统释放)

    例子:

#include <stdio.h>
void f()
{
	int a[5]={1,2,3,4,5}; //20个字节的储存空间程序员无法手动编程释放它
						  //它只能由本函数运行完毕时由系统自动释放
}
int main (void)
{
	return 0;
}
  1. 数组的长度一旦定义就不能在后续发生改变
    (数组的长度不能在函数运行的过程中动态的扩充或者缩小)

  2. 传统方式定义的数组不能跨函数使用。
    (在f函数中定义的数组,在f函数运行期间可以被其他函数使用,但f函数运行结束后不能被其他函数使用。)

#inlcude <stdio.h>
void g(int *p,int len )
{
	p[2] = 88 ;      // p[2]  == a[2]
}
void f(void)
{
	int a [5] = {1,2,3,4,5};
	g(a , 5) ;
	printf("%d",a[2]);
}
int main ()
{
	return 0 ;
}

为什么需要动态分配内存

  1. 动态数组很好的解决课传统数组中的这四个缺陷。
  2. 传统数组也叫静态数组

动态内存分配举例——动态数组的构造

malloc函数的使用
#include <stdio.h>
#include <malloc.h>
int main ()
{
	int i = 5 ;   //分配了4个字节  (静态分配)
	int *p = (int *)malloc(200); //动态分配 (第6行)
	/*
			1.指针变量p指向所开辟200字节的前四个节的地址(p本质是int * 类型,所以p  一定指向四个字节      )。
			2.使用malloc函数,需要添加 <malloc.h>这个头文件。
			3.malloc只能返回一个形参,并且形参是整型。
			4.200表示请求系统为本程序分配200个字节的空间。
			5.malloc函数只能返回第一个字节的地址。	
			6.在第6行中,系统总共分配了204个字节。其中指针变量p默认占4个字节(动态分配),程序请求系统占用了200个字节(静态分配)。
			7.指针变量p是静态分配的,而p所指向的内存是动态的。
	*/
	free(p); //将p所指向的内存释放掉。
			 /*
			 	1.p是静态分配的内存不会被释放
				2.p所指向的内存是动态分配的,调用free函数,可以将其释放掉。	
			 */
	return 0 ;
}

(*int )表示强制将系统为程序分配的200个字节按照int类型划分==(4个四个划分),即划分为50个int类型变量==(因为int类型的数据占四个字节

int 4个字节;
char 1个字节;
double 8个字节;

动态数组的构造
#include <stdio.h>
#include <malloc.h>
int main ()
{
	int a[5];
	int len ;
	int *p;
	
	printf("请输入你要存放的元素的个数:");
	scanf(“%d”,&len);
	pArr = (int *)malloc(4 * len);    //动态构造一维数组;
	// 其可类似于    int p [len] ;
 printf("请输入数组的内容:\n");
 for (i = 0 ; i < len ; i ++)
 scanf("%d",&pArr[i]);
 printf("动态数组的内容为:\n");
 for(i = 0 ; i < len ; i ++)
 printf("%5d",pArr[i]);
 free(pArr);     //将pArr释放掉
 return 0 ;
}

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

静态
  1. 静态内存是由系统给自动分配的,由系统自动释放
  2. 静态内存是在栈分配的
动态
  1. 动态分配是由程序员手动分配的 , 手动释放( “ free() ” )
  2. 动态内存是在堆分配的

动态内存跨函数使用

#include <stdio.h>
#include <malloc.h>  // 调用malloc函数所使用到的头文件
void f(int **q)   //存放指针变量p的地址
{
	*q = (int *)malloc(sizeof(int)); //等价于 p = (int *)malloc(sizeof(int));
	**q = 5 ;   // *p等价于p,即*p存放的是指针变量p的地址,**p表示p指针变量所指向地址中的内容,即5。
 } 
int main (void)
{
	int *p;
	f(&p);   //取指针变量p的地址发送给f()函数的形参。
	printf("%d",*p); //输出指针变量p所指向的地址中的内容
	return 0 ;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值