一、什么是内存的的动态存储
全局变量和静态变量分配在内存中的
静态变量区(全局变量区),普通局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是成为
栈的区域。除此之外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 *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;
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;
}
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。