对于空间的需求,变量,数组都能够解决。但是,有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。
这时候就只能试试动态存开辟了。
在c语言中给出了3个动态内存开辟的函数:malloc、calloc、realloc;
函数详解:
malloc
声明
void *malloc(size_t size)
参数
size -- 内存块的大小,以字节为单位。
返回值
该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。
calloc
声明
void *calloc(size_t nitems, size_t size)
参数
nitems -- 要被分配的元素个数。
size -- 元素的大小。
返回值
该函数返回一个指针,指向已分配的内存。如果请求失败,则返回 NULL。
realloc
声明
void *realloc(void *ptr, size_t size)
参数
ptr -- 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。
size -- 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。
返回值
该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。
三个函数的相同点是:
1. 函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
2. 如果开辟成功,则返回一个指向开辟好空间的指针。
3. 如果开辟失败,则返回一个NULL指针,因此返回值一定要做检查。
4. 返回值的类型是 void* ,所以函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
5. 如果参数 size 为0,函数的行为是标准是未定义的,取决于编译器。
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
void free(void *ptr)
参数
ptr -- 指针指向一个要释放内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果传递的参数是一个空指针,则不会执行任何动作。
返回值
该函数不返回任何值。
常见的动态内存错误
1. 动态开辟内存后,要进行判断是否开辟成功;
int* p=(int*)malloc(40);
if(p==NULL)
{
return -1;
}
2. 不要越界访问,
比如,动态开辟10个空间,你访问12个空间,这是不允许的;
3. 非动态开辟的内存不能使用free释放;
4. 开辟成功后,不能动起始位置指针,如果想动,就拿临时指针拷贝一个;
因为free函数释放是中间只能放动态内存的起始地址,不然会报错;
5. 不能多次释放同一动态内存;
6. 不要忘记释放开辟好的动态内存;
以上一定在开始学时就养成良好习惯,不要丢三落四;