目录
头文件
stdlib.h
malloc
calloc
free
realloc
string.h
memset
malloc
作用: 在堆区动态申请内存
语法:
void *malloc(size_t size);
参数:
size_t size:申请的内存地址大小,单位字节
数据类型所占字节:sizeof(数据类型)(需要获取的元素个数)*(数据类型所占字节)
返回值:
void *:申请的内存的首地址,如果地址返回为NULL说明申请失败
注意:
1.申请内存后要判断申请是否成功
如果nums为空则代表申请内存失败
if (nums == NULL)
{
printf("申请失败\n");
return 0;
}
2.malloc开辟的空间内默认值为随机数,因此需要使用memset函数将所有值初始化为0.
memset函数如下
3.动态内存分配的内存在堆区,无法自动释放,需要手动释放
memset
作用: 将指定开始位置到指定长度的内存中的内容设置为指定的值
语法:
void *memset(void *s, int c, size_t n);
参数:
void *s:开始的地址
int c:指定的内容
n:设定的长度
返回值:
设置的内存的首地址,也就是开辟的地址的首地址
calloc
作用: 在堆区动态申请内存
语法:
void *calloc(size_t nmemb, size_t size);
参数:
nmemb:申请的内存块数
size:每块所占的字节数
返回值:
void *:申请的内存的首地址,如果为NULL说明申请失败
注意:
size_t 实际是无符号整型,它是在头文件中,用 typedef 定义出来的。
realloc
作用: 追加内存
语法:
void *realloc(void *ptr, size_t size);
参数:
void *ptr:要追加的内存的首地址
size:重新申请的大小,单位字节
返回值:
void *:追加的内存的首地址,如果为NULL说明追加失败
注意:
该函数并不是在原基础上追加,而是从新开辟一片内存,将原内存中的值拷贝到新内存的前面
free
作用: 释放动态申请的内存
语法:
void free(void *ptr)
参数:
void *ptr:要释放的内存的首地址
返回值:
void:没有返回值
内存申请后,相对大一点的程序,如果没有释放内存,内存占完后,程序就不能继续运行下去,因此,在申请内存后,在保证使用结束的情况下要及时释放,而且要遵循由里向外释放,如果先释放了外部的内存,就会出现内存泄漏
内存泄漏
申请的内存,丢失了地址,无妨访问这片内存,既无法调用也无法删除
因此使用完申请的内存后需要释放
可能存在的情况:
1.指向堆区的指针变量被其他地址赋值,指向了其他地方,原来的那篇内存地址就丢失了
2.在函数中,函数调用完毕,指针被释放,内存未释放,也会到时地址丢失,内存泄漏
malloc与calloc的区别
malloc 和 calloc 函数都是用来申请内存的。
区别:
1) 函数的名字不一样
2) 参数的个数不一样
3) malloc 申请的内存,内存中存放的内容是随机的,不确定的,而 calloc 函数申请的内存中的内容为 0