动态内存的申请和释放

前提:系统的内存是有限的,而且内存分配会直接影响到程序的效率;
C语言有4个内存区间:

  • 代码区:主要存放程序中的代码,属性是只读的。
  • 全局变量与静态变量区,称为静态存储区:内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都是存在的。例如:全局变量,静态变量和字符串常量。分配在这个区域的变量在程序结束时才释放内存。经常利用这样的变量在函数间传递信息。
  • 局部变量区,称为栈区:在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动释放。栈内存分配运算内置于处理器的指令中,效率很高,但是分配的内存容量是有限的。这种内存方式,变量的分配和释放都是自动进行的,程序员不需要考虑内存管理的问题。但是缺点是栈的容量是有限的,且当相应的范围结束时,局部变量就不能在使用。
  • 动态存储区,称为堆区:有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预先分配空间,只有在程序运行时分配,所以称为动态分配。

常量的内存也是由系统管理的


malloc函数

在c语言中使用malloc函数来申请内存。
函数的原型:void *malloc(size_t,size);
头文件:#include <stdlib.h>
其中参数size代表需要动态申请的内存的字节数。如若申请成功,函数返回申请的内存的起始地址,如果申请失败返回NULL;
使用函数的注意事项:

  • (1)该函数只关心申请内存的大小。该函数的参数很简单,只有申请内存的大小,单位是字节。
  • (2)申请的是一块连续的内存。可能申请到的内存比实际的大,也可能申请不到返回NULL,但是若申请成功肯定是一块连续的内存。
  • (3)返回值的类型是void * 。函数的返回值不是某一种具体的指针,可以理解为该函数只是申请内存,对内存中存储什么类型的数据是没有要求的,实际运用中将void * 转换成所需要的指针类型。
  • (4)显示初始化。注意,堆区是不会自动在分配时做初始化,所以程序需要显式的初始化。

free函数

在堆区上分配的内存,需要用free函数显示释放;
函数的原型:void free(void *ptr);
头文件:#include <stdlib.h>
函数的参数是ptr,指的是需要释放的内存的起始地址。该函数没有返回值。
使用函数的注意事项:

  • (1)调用该函数的前提是必须提供内存的起始地址,不能提供部分地址,释放内存的一部分是不允许的。因此必须保存好malloc返回值的指针,若丢失,则所分配的堆空间无法回收,称为内存泄漏。
  • (2)malloc和free配对使用的,编译器不负责动态内存的释放,需要程序员释放。因此malloc与free配对使用避免内存泄漏。

代码简单解释

以下分别是给整形数组和char形数组申请动态空间以及释放空间。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
 char *p1;
 int *p2;
 char *p="afsfasfassf";           //后边的字符串存储在常量区,p存储在栈中;
 char str[]="afsfasfassf";     //这是将常量的字符串"afsfasfassf"内容拷贝到栈区的字符串数组上。
 int i,j;                  //b在栈中;
 p1=(char *)malloc(20);    //分配20个字节的区域在堆区 
 p2=(int *)malloc(sizeof(int)*10);
  strcpy(p1,"dsefsd");
  printf("%s\n",p1);
  free(p1);
  p1=NULL;
  int s=20;
  for(i=0;i<10;i++){
   p2[i]=++s;
  }
  for(j=0;j<10;j++){
   printf("%d ",p2[j]);
  }
  free(p2);
  p2=NULL; 
 return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值