一、calloc()
1.原型
void* calloc(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.原型
void* realloc(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。
如有错误,希望指正,谢谢!