C 语言中,free可以释放colloc, malloc, realloc 动态分配的空间。首先,free释放的不是定义的指针,而是定义的指针指向的空间。
对于定义的普通指针,如果定义的指针指向动态分配的地址空间,则可以使用free释放指针指向的这段空间;否者,就不能使用free释放指针指向的空间。
例子:
1. char *p=null;
2. p=(char*)malloc(1024);
3. if(p!=NULL) free(p);
这段代码是对的;
1.char *p=NULL;
2.char buf[1024];
3.p=(char*)buf;
4.free(p);
这个是错误的。
它们用法:
1. realloc()
void *realloc(void * ptr,size_t newsize);
功能:更改以前分配的内存长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。改变ptr指针指向内存区域大小为newsize。
- malloc()
void* malloc(num * sizeof(dataType));
功能:申请指定字节数的内存。申请到的内存中的初始值不确定。产生一个指向大小为num * sizeof(dataType)的内存空间的指针。
calloc
为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存的每一位(bit)都初始化为0alloca
在栈上申请内存。
用法和注意
1. malloc
分配指定字节数的存储区。此存储区中的初始值不确定
2. calloc
为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0
3. realloc
更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定
4. alloca
因为在栈上申请的内存,所以程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca不宜使用在必须广泛移植的程序中