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

      我们知道,当我们声明一个数组的时候,必须要用一个常量指定数组的长度,这是由于它所需要的内存空间取决于数据。但是如果我们不能预测程序所需要的精确数组长度,为了保证足够的空间,常常声明一个很大的长度,由此便可能造成不必要的空间浪费。所以引入了动态内存分配的概念。

    在动态内存分配中,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掉一个空指针是可以的。


你可能感兴趣的:(动态内存分配)