首先使用以下函数需要使用库<stdlib.h>:malloc(申请动态内存空间)、free(释放动态内存空间)、calloc(申请并初始化一系列内存空间)、realloc(重新分配内存空间)。
malloc:原型void *malloc(size_t size):向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针,调用成功则返回一个指向申请的内存空间的指针,因为返回类型是void指针,所以可以返回任何类型的数据,失败返回NULL。malloc是从堆中分配空间而不是栈所以必须free手动释放空间。
int *p1=NULL;
p1=(int *)malloc(sizeof(int)*10);
free:原型为void free(void *p):可以释放空间,但释放的空间必须由malloc、calloc、realloc申请,若p==NULL则不执行任何操作
calloc:原型void*calloc(size_t nmemb,size_t size):动态申请nmemb个长度为size的连续内存空间,即总尺寸为nmemb*size,且全部初始化为0(也是与malloc的主要区别)
int *p1=NULL;
p1=(int *)calloc(5,sizeof(int))
/* 等价于
p1=(int *)malloc(sizeof(int)*5);
memset(p,0,5*sizeof(int));
*/
realloc:原型void *realloc(void *p1,size_t size):新分配内存比原来大,则旧内存块数据不发生改变,直接复制数据到新内存。若新内存空间大小小于旧内存,则会造成数据丢失。该函数将移动旧内存空间的数据至新内存并返回新指针,地址不同与旧。成功后自动free释放原本p1的内存空间,失败则返回NULL。使用时p1必须调用malloc、calloc才可使用,或p1原本的值为NULL,则realloc相当于malloc函数
#include<stdio.h>
#include<stdlib.h>//malloc等
#include<string.h>//mem-等
#define NUM 10000
/*动态分配内存并写入数据,将其打印
输入-1时退出输入,并通过用户需求扩展内存*/
int main()
{
int *p1=NULL;
int *p2=NULL;
int i,j;
char ch;
p1=(int *)calloc(5,sizeof(int));
/*等价:p1=(int *)malloc(sizeof(int)*5);
memset(p,0,5*sizeof(int));*/
if(p1==NULL)
{//分配失败
printf("error\n");
exit(1);//退出并返回1
}
for(i=0;i<5;i++)
{
printf("输入数据:\n");
scanf("%d",&p1[i]);//&p1[i]==*(p1+i)
if(p1[i]==-1)
{//输入-1时退出
break;
}
}
j=i;
printf("您目前输入的数据为:\n");
for(i=0;i<j;i++)
{
printf("%d ",p1[i]);
}
printf("\n");
printf("您是否想继续输入:y/n");
printf("\n");
getchar();
scanf("%c",&ch);
if(ch=='y')
{//扩展内存空间
p2=(int *)realloc(p1,NUM*sizeof(int));
/*等价于 p2=(int *)calloc(10,sizeof(int));
memcpy(p2,p1,5);
free(p1);*/
for(i=j;i<NUM;i++)
{
printf("请继续输入数据:\n");
scanf("%d",&p2[i]);
if(p2[i]==-1)
{
break;
}
}
j=i;
printf("您目前输入的数据为:\n");
for(i=0;i<j;i++)
{
printf("%d ",p2[i]);
}
free(p2);
}
free(p1);
return 0;
}