您的位置:首页 > 其它

动态内存分配课后小结(1)

2015-12-16 23:15 447 查看
我们知道,当我们声明一个数组的时候,必须要用一个常量指定数组的长度,这是由于它所需要的内存空间取决于数据。但是如果我们不能预测程序所需要的精确数组长度,为了保证足够的空间,常常声明一个很大的长度,由此便可能造成不必要的空间浪费。所以引入了动态内存分配的概念。
在动态内存分配中,C函数库给我们提供了四个函数,分别是malloc(),realloc(),calloc()以及free()。
一.malloc()函数的用法及注意事项
例:#include<stdio.h>
#inlcude<stdlib.h>
int main()
{
int i=0;
int* p=(int* )malloc(10*sizeof(int));
/*这里给指针p开辟了4个整形空间的大小,即40个字节。注意此处必须有强制类型转换,还有sizeof所求长度的对象类型*/
if(p=NULL)
{
printf("out of memory");
exit(-1);
/*此处相当于exit(EXIT_FAILURE);*/
for(i=0;i<10;i++)
{
p[i]=i;
}
return 0;
}
}
注意:单次malloc开辟出的空间是连续的,内容并未初始化,是一个随机值。多次开辟出来的不一定连续,所以要考虑内存碎片的问题。
二.calloc()
calloc()的主要功能和malloc()一样用于分配内存,但是与后者不同的是在返回的时候将内存全部初始化为0,这将节省初始化的时间,calloc的参数包括所需元素的数量和每个元素的字节数。
例:#include<stdio.h>
int main( )
{
int i=0;
int* p=(int*)calloc(sizeof(int)*10);
for(i=0;i<10;i++)
{
p[i]=i;
}
return 0;
}
三.realloc()
这个函数主要用于修改已将分配的内存大小,在realloc(p,size)中,p指向前面已经分配好的内存,size指调整后的大小,而且p指向的内容必须是用malloc开辟出来的。如果在函数中调用了malloc函数,而且在函数调用之后不用free释放掉该空间,则该空间不会被释放,知道整个程序结束。
※在堆上开辟的空间,都必须用free()才能释放,例如malloc(),由此可说明free()内部有某种机制识别空间能否被free掉。
四,常见的动态内存错误
1.释放一部分开辟后的内容
#include<stdio.h>
int main( )
{
int* p=(int*)malloc(sizeof(int)*10);
free(p+5);/*释放5个整型空间的大小*/
return 0;
}
※.free之后,p的指针并不为空,依然指向原来的地址,因此在释放之后,一定要将p赋成NULL,而且在使用指针之前一定要判断其是否为空,但是free掉一个空指针是可以的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态内存分配