定义数组时,占用静态分配单元,数组大小在编译阶段就确定了,而实际应用中又经常需要在程序运行期间才确定数组大小,这就需要动态分配函数malloc和calloc,从内存空间中的堆中获取动态空间,建立动态数组。(在C#中不用这么麻烦啦,一个List类就解决问题)
void* malloc(unsigned size);//按字节数size分配内存空间,返回空间起始地址。
void* calloc(unsigned numElements,unsigned sizeofElements);//按元素个数和元素大小分配内存空间,返回空间起始地址。
如果动态分配没有成功,返回值为NULL,这时应该终止程序。
建立一个长度为n的一维整形数组:
int* ptr; ptr=(int*)malloc(n*sizeof(int));//ptr的n个元素都为随机值
int* ptr; ptr = (int*)calloc(n,sizeof(int));//ptr的n个元素均自动初始化为0
动态分配的返回值是一个指针,但它是一个void型指针,它指向的空间是纯粹的空间,还不是某种类型的数据空间,强制转换成某种类型的指针后,它指向的空间就成为了这种类型的数组空间。
在编程时,要养成良好的习惯,申请之后一定要判断是否成功申请,若不成功一定要结束程序以免进行后续无效操作。在动态空间不需要的时候,必须由程序员释放掉。
int* ptr;
ptr = (int*)malloc(n,sizeof(int));
if(ptr == NULL)
{
printf("allocation failure");
exit(1); //终止程序控制权,交还给操作系统。在stdlib.h中
}
...
free(ptr); // 撤销指针变量所指向的动态数组空间
空间的释放free()是一定要做的,不然回引起动态空间资源的耗尽!
然而事情都是两面的,撤销后也有撤销后的隐患。撤销后,ptr可能任然存放着这段空间的首地址,但不能再通过这个指针间接引用这段空间,此时他已经变成”野指针“了!如果再来一次free(ptr);,会造成系统崩溃的!