C语言中动态分配内存
什么是内存动态分配:全局变量是分配在内存中的静态存储区的,非静态的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域。所谓动态分配内存指的是C语言允许建立内存动态分配区域,需要时开辟,不需要时释放,这个动态存储区成为堆。
怎样建立内存的动态分配:主要有四个库函数:malloc calloc free realloc
1.malloc函数 void *malloc(unsigned int size)
作用是在内存中分配一个长度为size的连续空间,返回值是指针。如果分配失败,返回NULL。
2.calloc 函数 void *calloc(unsigned n, unsigned size)
作用是在内存中分配n个长度为size的连续空间,返回起始地址。若果分配失败,返回NULL。用calloc函数可以建立动态数组,n为数组元素个数,size为每个元素的长度。
3.free函数 void *free(void *p)
释放由p所指向的动态存储区,无返回值。
4.realloc函数 void *realloc(void *p,unsigned int size)
用于改变有malloc或者calloc开辟的动态区域的大小。若失败,则返回NULL。
注意:除free函数外,每个函数的返回值都是void * 型的指针。在使用这几个函数时,要进行强制类型转换。这几个函数同在C++中的<cstdlib>中。
void 指针类型:不指向任何具体的数据。不要理解为指向任意类型,而是空类型,不指向任何类型,需要强制转换才能赋值给其他类型的指针。
例子源代码:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
void check(int *); //由于函数出现在定义之前,故需要申明
int *p1,i; //p1为指向整型变量的指针
void *p2; //p2为指向void型的指针
p2=malloc(5*sizeof(int));//sizeof()为求类型的字节数
p1=(int *)p2; //强制类型转换
for(i=0;i<5;++i)
scanf("%d",p1+i); //随机访问
check(p1);
free(p2); //释放p2所指向的区域
}
void check(int *p)
{
int i;
printf("They are fail:");
for(i=0;i<5;++i)
if(p[i]<60)printf("%d",p[i]);
printf("\n");
}
知识总是要一点一点积累的,欲速则不达...