由系统自动进行类型转换。原文链接:http://www.hackbase.com/tech/2009-02-02/44968.html
真正实现动态存储分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数。(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)
1.malloc函数:开辟指定大小的存储空间,并返回该存储区的起始地址。函数原型为
void *malloc(unsigned int size)
其中size为需要开辟的字节数。函数返回一个指针,该指针不指向具体的类型,当将该指针赋给具体的指针变量时,需进行强制类型转换。若size超出可用空间,则返回空指针值NULL。
例如
float *p1;
int *p2;
p1=(float *)malloc(8);
*p1=3.14;
*(p1+1)=-3.14;
p2=(int *)malloc(20*sizeof(int));
for(i=0;i<20;i++)
scanf(“%d”,p2++);
分别开辟了8字节和20×2字节的存储空间,并向其中存入数据。
2. calloc函数:按所给数据个数和每个数据所占字节数开辟存储空间。函数原型为
void *calloc(unsigned int num, unsigned int size)
其中num为数据个数,size为每个数据所占字节数,故开辟的总字节数为num*size。函数返回该存储区的起始地址。
例如 上例中p2可改写为
p2=(int *)calloc(20, sizeof(int));
例如
calloc(10,20)
可开辟10个且每个大小均为20字节的存储空间。
3. realloc函数:重新定义所开辟内存空间的大小。函数原型为
void *realloc(void *ptr, unsigned int size)
其中ptr所指的内存空间是用前述函数已开辟的,size为新的空间大小,其值可比原来大或小。函数返回新存储区的起始地址(该地址可能与以前的地址不同)。例如
p1=(float *)realloc(p1,16);
将原先开辟的8个字节调整为16个字节。
4. free函数:将以前开辟的某内存空间释放。函数原型为
void free(void *ptr)
其中ptr为存放待释放空间起始地址的指针变量,函数无返回值。应注意:ptr所指向的空间必须是前述函数所开辟的。例如
free((void *)p1);
将上例开辟的16个字节释放。可简写为
free(p1);