文章目录
动态分配
malloc()、free()函数介绍
1、malloc(memory allocation)
中文名称:动态内存分配
malloc()用于申请一块连续的指定大小的内存块区域、以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。malloc(free)函数头文件#include<stdlib.h>
(void *)malloc(int size) #malloc函数原型
由于函数的返回值是void *类型的,所以必须强制转换成你所接收的类型。也就是说,这块内存将要用来存储什么类型的数据。比如:
char *p = (char *)malloc(100);
#在堆上分配了100个字节内存,返回这块内存的首地址,
#把地址强制转换成char *类型后赋给char *类型的指针变量p
注意这点:如果所申请的内存块大于目前堆上剩余内存块(整块),则内存分配会失败,函数返回NULL。注意这里说的“堆上剩余内存块”不是所有剩余内存块之和,因为malloc函数申请的是连续的一块内存。既然malloc函数申请内存有不成功的可能,那我们在使用指向这块内存的指针时,用if(NULL!=p)语句来验证内存是否分配成功。
2、free函数
与malloc对应的是free函数。free函数只有一个参数——所要释放的内存块的首地址(切断指针变量与这块内存的关系)。使用free函数之后指针变量p本身保存的地址并没有改变,那我们就需要重新把p的值变为NULL:
p = NULL;
使用free函数之后指针变量p本身保存的地址并没有改变,那我们就需要重新把p的值变为NULL,以便继续通过p指针来访问内存:
函数使用实例
1、关于C动态申请数组(整形数据类型)空间的应用
#include<stdio.h>
#include<malloc.h>
int main()
{
int n;//数组元素个数
int *arr;
scanf("%d",&n);
arr=(int *)malloc(sizeof(int)*n);//内存申请
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++)
{
printf("%d",arr[i]);
}
return 0;
}
2、中文藏头诗(使用动态内存分配和指针数组)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *poem[20],mean[20],str[80];
int i,n=0;
printf("输入四行后,输出任意字符结束\n");
scanf("%s",&str);
while (n<4){
poem[n] = (char *)malloc(sizeof(char)*(strlen(str)+1));
//动态分配
strcpy(poem[n],str);
//将输入的字符串赋值给动态内存单元
n++;
scanf("%s",&str);
}
for(i=0;i<4;i++){
mean[2*i]=*(poem[i]);//每行取第一个字符
ps:strlen统计的是字节数,所以汉字占用两个字节.
mean[2*i+1]=*(poem[i]+1);
}
mean[2*i]='\0';
printf("%s\n",mean);
for(i=0;i<4;i++)//释放动态内存单元
free(poem[i]);
return 0;
}
看到这里了,点个赞再走吧!