函数快查 - 《带你学C带你飞》系列教程对应课后作业|扩展练习|案例解读|扩展阅读 - Powered by Discuz! (fishc.com.cn)
malloc:申请动态内存空间
函数原型:void *malloc(size_t size);(返回的void指针可以强转成任意类型指针)
malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。
如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针,所以它可以被转乘任何类型数据。如果函数调用失败,返回值NULL。另外size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *ptr;
ptr=(int *)malloc(sizeof(int));
if(ptr == NULL)
{
printf("failed\n");
exit(-1);
}
printf("please input a num:\n");
scanf("%d",ptr);
printf("num=%d\n",*ptr);
return 0;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p37-1.c
lhy@ubuntu:~/xiaojiayu$ ./a.out
please input a num:
66
num=66
用malloc申请的空间是在堆上面的,要我们主动使用free函数去释放这空间资源,不然可能会导致内存泄露。
malloc还可以申请一块任意大小的内存空间。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int num;
int *ptr=NULL;
printf("please input num:\n");
scanf("%d",&num);
ptr=(int *)malloc(num*sizeof(int));
if(ptr == NULL)
{
exit(-1);
}
for(i=0;i<num;i++)
{
printf("please input %d number:",i+1);
scanf("%d",&ptr[i]);
}
printf("this is you input numbers:\n");
for(i=0;i<num;i++)
{
printf("%d\n",ptr[i]);
}
free(ptr);
return 0;
}
运行结果:
please input num:
6
please input 1 number:33
please input 2 number:66
please input 3 number:97
please input 4 number:89
please input 5 number:12
please input 6 number:63
this is you input numbers:
33
66
97
89
12
63
free:释放动态内存空间
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *ptr;
ptr=(int *)malloc(sizeof(int));
if(ptr == NULL)
{
printf("failed\n");
exit(-1);
}
printf("please input a num:\n");
scanf("%d",ptr);
printf("num=%d\n",*ptr);
free(ptr);
printf("num=%d\n",*ptr);
return 0;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ ./a.out
please input a num:
99
num=99
num=0
calloc:申请并初始化一系列内存空间
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int *ptr1=NULL;
int *ptr2=NULL;
//第一次申请的内存空间
ptr1=(int *)malloc(10*sizeof(int));
//进行若干操作之后发现ptr1申请的内存空间竟然不够用
//第二次申请内存空间
ptr2=(int *)malloc(20*sizeof(int));
//将ptr1的数据拷贝到ptr2
memcpy(ptr2,ptr1,10);
free(ptr1);
//对ptr2申请的内存空间进行若干操作
free(ptr2);
return 0;
}
realloc:重新分配内存空间
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i;
int num;
int count=0;
int *ptr=NULL;//此处必须初始化为NULL
do
{
printf("please input a number,-1 is end:\n");
scanf("%d",&num);
count++;
ptr=(int *)realloc(ptr,count*sizeof(int));
if(ptr == NULL)
{
exit(1);
}
ptr[count-1]=num;
}while(num != -1);
printf("input numbers is::\n");
for(i=0;i<count;i++)
{
printf("%d ",ptr[i]);
}
printf("\n");
free(ptr);
return 0;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ gcc p38-3.c
lhy@ubuntu:~/xiaojiayu$ ./a.out
please input a number,-1 is end:
36
please input a number,-1 is end:
96
please input a number,-1 is end:
56
please input a number,-1 is end:
55
please input a number,-1 is end:
66
please input a number,-1 is end:
52
please input a number,-1 is end:
87
please input a number,-1 is end:
89
please input a number,-1 is end:
-1
input numbers is::
36 96 56 55 66 52 87 89 -1
更详细的可参考:C语言进阶(七)——动态内存管理_rain67的博客-CSDN博客
内存泄露:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a=123;
int *ptr;
ptr=(int *)malloc(sizeof(int));
if(ptr == NULL)
{
printf("failed\n");
exit(-1);
}
printf("please input a num:\n");
scanf("%d",ptr);
printf("num=%d\n",*ptr);
ptr=&a;
printf("num=%d\n",*ptr);
free(ptr);
return 0;
}
运行结果:
lhy@ubuntu:~/xiaojiayu$ ./a.out
please input a num:
33
num=33
num=123
munmap_chunk(): invalid pointer
Aborted (core dumped)