动态内存申请
静态分配
在编译的时候,按事先规定的大小进行分配,比如:int a[10]。
必须事先指定空间大小。
分配在栈里或全局变量区。
按计划分配。
动态分配
在程序运行中,根据需要大小自由分配,程序员字节分配。
分配在堆里,一般使用特定函数进行分配。
按需分配。
动态分配函数
#### malloc函数:
开辟一片连续内存空间,需要手动初始化。
语法:接收=malloc(所需开辟空间大小)。
注意指针变量类型需要开票所需的数据类型保持一致。
free函数:
语法:free(指针变量)
int main()
{
char *p;
p=(char *)malloc(sizeof(char)*10);//申请一个存10个int型的空间
if(p==NULL)
{
printf("shi bai");
}
memset(p,0,10);
int i;
for(i=0;i<10;i++)
{
p[i]='z';
printf("%c\n",p[i]);
}
free(p);//释放空间,不释放回内存泄漏
p = NULL; //防止称为野指针
return 0;
}
calloc函数:
开辟一片连续的内存空间,自动初始化
语法:指针=calloc (元素个数,元素所占字节)
int main()
{
int *p;
p=(int*)calloc(20,sizeof(int));
if(p==NULL)
{
printf("shibai");
}
int i;
for(i=0;i<20;i++)
{
p[i]=i;
printf("%d\n",p[i]);
}
free(p);
p = NULL;
return 0;
}
recalloc函数:
重新分配内存空间大小。
语法:指针=recalloc(已分配内存指针变量,重新分配空间大小的字节数)
int main()
{
int *p;
p=(int*)calloc(20,sizeof(int));
if(p==NULL)
{
printf("shibai");
}
int i;
for(i=0;i<20;i++)
{
p[i]=i;
printf("%d\n",p[i]);
}
p = realloc(p,sizeof(int)*25);
for(i=0;i<25;i++)
{
printf("%d\n",p[i]);
}
free(p);
p = NULL;
return 0;
}
内存泄漏
申请的内存,首地址丢失,找不到,没办法释放。
易错
a+1=>//a是一维数组,加一个元素
a+1=>//a是二维数组,加一行
&a+1=>a是二维数组,加整个组