[C语言]动态内存分配

一、什么是内存的的动态存储

全局变量和静态变量分配在内存中的 静态变量区(全局变量区),普通局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是成为 的区域。除此之外C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时开辟,不需要时随时释放,生命周期从调用malloc函数时创建,调用free函数时销毁。这些数据时临时存放在一个特殊的自由存储区,称为 区。可以根据需要,向系统申请所需大小的空间。

二、怎样建立内存的动态分配

对内存的动态分配是通过系统提供的库函数实现,主要有malloc,calloc,realloc,free这4个函数。四个函数都要调用头文件stdlib.h .

  • malloc函数

(类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。

//求n以内的素数

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

void SiftPrime(int n)
{
 int *p= (int*)malloc(n*sizeof(int)); //注意指针的基类型为void,须根据需要自己进行 强转
 assert(p!=NULL);
   if(p==NULL)
   {
    return;
  
   }
 int i;
 for(i=0;i<n;i++)
 {
  p[i]=1;
 
 }
 p[0]=0;
 p[1]=0;
 for(i=2;i<n;i++)
 {
  for(int j=i+1;j<n;j++)
  {
   if(j%i==0)
   {
    p[j]=0;
   
   }
  }
 }
 for(i=0;i<n;i++)
 {
  if(p[i]==1)
  {
   printf("%d\n",i);
  
  }
 }
 free(p); //malloc函数与free函数搭配使用,free()释放内存,防止内存泄露
}
int main()
{
 SiftPrime(10);
 return 0;
}

  • free函数

其作用是释放指针所指向的动态空间,使这部分空间能重新被其他变量使用。free函数没有返回值。

free崩溃的原因:

1.越界(少了sizeof( ) )

2.出现指针移动(p不是之前的p了,头找不到了)

3.重复释放同一内存

4.释放栈内存

  • calloc函数

/*
int a=10;
int*p=(int *)malloc(a*sizeof(int));
for(int i=0;i<10;i++)
{
 p[i]=0;
}
*/      等同于calloc函数

int *p=(int *p)calloc( n,sizeof(int));

malloc与calloc的区别:

malloc它允许从空间内存池中分配内存,malloc()的参数是一个指定所需字节数的整数.
例如:int*p=(int*)malloc(n*sizeof(int));
  colloc与malloc类似,但是主要的区别是存储在已分配的内存空间中的值默认为0,使用malloc时,已分配的内存中可以是任意的值.
  colloc需要两个参数,第一个是需要分配内存的变量的个数,第二个是每个变量的大小.
例如:int*p=(int*)colloc(n,sizeof(int));

  • realloc函数

如果已通过malloc函数或calloc函数获得了动态空间,想改变其大小(扩容),可以用realloc函数重新分配。

p=(int*)realloc(p,80);

用realloc函数将p所指向的动态空间的大小改变为80,p的值不变,如果重分配不成功,返回NULL。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值