C语言 calloc, malloc, realloc ,alloca以及 free的用法

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。

  1. malloc()
void* malloc(num * sizeof(dataType));

功能:申请指定字节数的内存。申请到的内存中的初始值不确定。产生一个指向大小为num * sizeof(dataType)的内存空间的指针。

  1. calloc
    为指定长度的对象,分配能容纳其指定个数的内存。申请到的内存的每一位(bit)都初始化为0

  2. alloca
    在栈上申请内存。

用法和注意
1. malloc
分配指定字节数的存储区。此存储区中的初始值不确定
2. calloc
为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0
3. realloc
更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定
4. alloca
因为在栈上申请的内存,所以程序在出栈的时候,会自动释放内存。但是需要注意的是,alloca不具可移植性, 而且在没有传统堆栈的机器上很难实现。alloca不宜使用在必须广泛移植的程序中

你可能感兴趣的:(C)