malloc(申请动态内存空间)
free(释放动态内存空间)
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
//申请一动态内存空间,在堆里,如不释放,直到程序结束才会销毁
p=(char *)malloc(sizeof(char));
if(p == NULL)
{
printf("分配内存失败");
exit(1);
}
printf("输入一个字符:\n");
scanf("%c",p);
printf("你输入的字符是%c\n",*p);
//释放动态内存空间,p指向无意义的地方
free(p);
printf("你输入的字符是%c\n",*p);
return 0;
}
经典错误:下面的程序会出错,因为申请的内存空间只有p知道地址,给p指向别的地址后,申请的空间地址又有谁知道呢,而且用free不能去释放一个局部变量。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
int num=123;
//申请一动态内存空间,在堆里,如不释放,直到程序结束才会销毁
p=(char *)malloc(sizeof(char));
if(p == NULL)
{
printf("分配内存失败");
exit(1);
}
printf("输入一个字符:\n");
scanf("%c",p);
printf("你输入的字符是%c\n",*p);
//释放动态内存空间,p指向无意义的地方
p=#
printf("你输入的字符是%c\n",*p);
free(p);
return 0;
}
malloc函数可以申请一块连续的任意尺寸的内存空间,所以经常使用数组来索引;
int main()
{
int *p=NULL;
int num,i;
printf("请输入要输入的数字个数:\n");
scanf("%d",&num);
//申请一段连续的内存,长度为num个int的长度(字节)
p=(int *)malloc(num * sizeof(int));
if(p == NULL)
{
printf("分配内存失败");
exit(1);
}
for(i=0;i<num;i++)
{
printf("请输入第%d个数\n",i+1);
scanf("%d",&p[i]);
}
printf("你输入的整数是\n");
for(i=0;i<num;i++)
{
printf("%d\n",p[i]);
}
putchar('\n');
/*一定要释放内存切记!
一定要释放内存切记!
一定要释放内存切记!*/
free(p);
return 0;
}
malloc函数不会初始化内存空间,需要自己初始化,可以用循环,但是不建议,因为标准库提供了更加方便的函数memset;函数快查链接
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
int main()
{
int *p=NULL;
int num,i;
//申请一段连续的内存,长度为N个int的长度(字节)
p=(int *)malloc(N * sizeof(int));
if(p == NULL)
{
printf("分配内存失败");
exit(1);
}
//初始化为0;
memset(p,0,N * sizeof(int));
printf("你输入的整数是\n");
for(i=0;i<N;i++)
{
printf("%d\n",p[i]);
}
putchar('\n');
/*一定要释放内存切记!
一定要释放内存切记!
一定要释放内存切记!*/
free(p);
return 0;
}
这样做可能会有些麻烦,我们可以使用calloc函数
有时候我们申请的空间可能不够用需要扩展,比如需要包含20个数字的数组,我们之前使用的是十个数的,并且这十个已经赋值,该怎么办呢?具体逻辑如下:
可以发现,这个很繁琐,那有没有更好的库函数呢?有的:realloc
int main()
{
int num,i;
int count = 0;
int *p = NULL;//这里一定要初始化为null,因为realloc函数在*p为空时相当于malloc函数
do
{
printf("请输入数字(-1结束):\n");
scanf("%d",&num);
count++;
p=(int *)realloc(p,count*sizeof(int));
if(p == NULL)
{
printf("内存空间不足");
exit(1);
}
p[count-1] = num;
}
while(num != -1);
printf("您输入的数字为:\n");
for(i=0;i<count;i++)
{
printf("%d\n",p[i]);
}
putchar('\n');
free(p);
return 0;
}