calloc()和realloc()的用法详解

一、calloc()

        1.原型

        voidcalloc(size_t nmemb, size_t size);

        2.功能

        在内存动态存储区中分配nmemb块长度为size字节的连续区域。calloc自动将分配的内存  置0。

        3.参数

        nmemb:所需内存单元数量

        size:每个内存单元的大小(单位:字节)

        4.返回值:

        成功:分配空间的起始地址

        失败:NULL

        5.calloc()与malloc()的取别

 可以看见malloc()分配的内存空间里为随机数。

 calloc()会自动将分配的内存置0,这是与malloc的不同之处。

二、realloc

        1.原型

        voidrealloc(void *ptr, size_t size); 

        2.功能

        重新分配用malloc或者calloc函数在堆中分配内存空间的大小。

        realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。

        3.参数

        ptr:为之前用malloc或者calloc分配的内存地址,如果此参数等于NULL,那么和realloc与malloc功能一致

        size:为重新分配内存的大小, 单位:字节

        4.返回值

        成功:新分配的堆内存地址

        失败:NULL

        5.举例

 现在将原先的10个单元数量增加到11个,发现增加前和增加后的地址一样,这是因为如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存。

 现在增加到20个,增加前后的地址不一样了,这是因为指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。

现在又有了一个新问题,现在将原先内存中的值拷贝到新的内存,那这个新分配的内存中剩下的十个空间中的值是会给置0,还是随机值呢?

 很明显剩下的为随机值,所以如果开辟的比原先的大,后面多出来的空间并不会给置0。

如有错误,希望指正,谢谢!

猜你喜欢

转载自blog.csdn.net/LM0624/article/details/126943640
今日推荐