C malloc和calloc函数总结
malloc和calloc可以动态的分配内存,即:编译的时候不会分配内存运行的时候才会分配内存。很像高级语言中的new关键字。
这样的好处自然是不用多说。现在对他们的用法及注意点进行总结:
先看malloc,代码如下:
#include<stdio.h>#include<stdlib.h>#defineN5intmain(){inti=0;int*nums;nums=(int*)malloc(N*sizeof(int));//其实nums相当与[]数组:一个int类型的数组//为nums赋值for(i=0;i<N;i++){printf("请输入第%d个数值:",i+1);scanf("%d",(nums+i));}for(i=0;i<N;i++){printf("第%d个元素的值为:%d\n",i+1,*(nums+i));}free(nums);nums=NULL;return0;}
运行结果如下图:
现对malloc的解释如下:
1,malloc定义一个数组,数组类型需要使用强转指针,比如(int *)的意思就是:定义了一个int类型的数组,至于数组的长度即时在N*sizeof(int)中表现。N*sizeof(int)即为 5X4=20,既是在内存中动态的分配20个字节,而每个int类型占4个字节(sizeof(int)获得的 , 可能在其他的IDE中是不一样的)。其实用20/4就可以得到数组的长度为5了。
2,用完后需要手动free掉指针,这比单纯的使用数组的效率要高,但是存在一定的风险。
再看 calloc,代码如下:
#include<stdio.h>#include<stdlib.h>#defineN5intmain(){inti=0;int*nums=NULL;nums=calloc(N,sizeof(int));//为nums赋值for(i=0;i<N;i++){printf("请输入第%d个数值:",i+1);scanf("%d",(nums+i));}for(i=0;i<N;i++){printf("第%d个元素的值为:%d\n",i+1,*(nums+i));}free(nums);nums=NULL;return0;}
运行的结果和malloc的一样,就不再给图了。
事实上,calloc和malloc产生的想过是一样的,但是它们的用法上有些区别:
1,malloc需要强制转换,而calloc不需要强制转换
2,malloc和calloc的参数是不一样的:
①,malloc只有一个参数, 为数组的大小*数组类型所占的空间字节大小,为一个参数
②,calloc有2个参数, 1 : 数组的大小 ; 2 : 数组类型所占的空间字节大小。
现在提出一个注意点:
关于 free(nums) : 释放nums一定要注意,如果使用了nums++等让指针美誉指向数组的头(第一个元素),那么即使是使用了free,指针也不能被释放掉。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。