动态内存:
malloc函数:
作用:用于申请一块连续的指定大小的内存块区域以(void *)类型返回分配的内存区域地址,当无法知道内存具体位置的时候,就要用到动态分配内存。
函数声明:(返回为(void *)类型)
void *malloc(
size_t size
);
需要的头文件:
#include <stdlib.h>
或
#include <malloc.h>
应用:(指针类型) 变量名 =(指针类型)malloc(n * sizeof(类型));//(指针类型)强转为同变量类型;
如:int *arr = (int *)malloc( n * sizeof( int )); //分配n个(int)大小的内存,arr指向该内存的首部;
相当于:
int arr[n]; //c99不支持;大部分编译器会出现语法错误;当n=4时,
malloc的“近亲”:calloc,realloc;
calloc函数:
作用:在内存的动态存储区分配n个长度为size(类型)的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
函数声明:(返回为(void *)类型)
void *calloc(
size_t num,
size_t size
);
同malloc函数相同的头文件:
#include <stdlib.h>
或
#include <malloc.h>
应用:(指针类型) 变量名 =(指针类型)calloc(n ,sizeof(类型));//(指针类型)强转为同变量类型;
如:int *arr = (int *) calloc ( n , sizeof(int) ); //将n个(int)初始化为0;arr指向该内存首部;
相当于:int *arr = (int*) malloc (a*sizeof(int));
for(int i=0;i<a;i++)
{
arr[i] = 0;
}
int n=4;
realloc函数:
作用:(对原内存进行扩充)在内存的动态存储区分配m(新的大小)个长度为size(类型)的连续空间,将原来的内容拷贝到新的内存;
注意:新的大小可小。如果新的内存大于原内存,则新分配部分不会被初始化;如果新的内存小于原内存,则可能会导致数据丢失。
函数声明:(返回为(void *)类型)
void *realloc(
void *memblock,
size_t size
);
同malloc函数相同的头文件:
#include <stdlib.h>
或
#include <malloc.h>
应用:(
指针
类型)变量名 =
(指针类型)realloc(原内存的指针名,新的大小);//
(指针类型)强转为同变 量类型;
如:int *brr = (int *)realloc(arr,2*n*sizeof(int)); //将arr的内容存入2*n*sizeof(int)的内存中;brr指向 新的内存;
int n=4;
free()函数:
作用:释放malloc、calloc、realloc函数给指针变量分配的内存空间的函数,使用后将该指针变量指向NULL,防止野指针。
函数声明:
void free(
void *memblock
);
应用:free(动态内存的指针);
如:free(arr);
注意:系统在分配内存时,为了好管理,通常在内存首尾增加标识。如果在使用内存时越界,free()函数在释放内存时崩溃。
可能“崩溃”的原因:
1、越界。如:malloc函数漏写sizeof,realloc第二个参数写错
2、改变指针的指向(free()通过首部标识释放内存)。如:p++
3、重复释放内存。如:释放同一内存。(避免发生,将 p=NULL;)
int *p = (int *)malloc(40); int *q = p; free(p); free(q);
4、释放不是动态申请的内存(动态申请的内存才有首尾标识)。如:
int arr[10]; free(arr);