#include <unistd.h>
int brk(void * end_data_segment) return 0 on success -1 on error
系统会将program break设置为参数end_data_segment所指定的位置,
void *sbrk(intptr_t increment) return previous paogram break on success (void *) -1 on error.
sbrk()将pragram break 在原有地址上增加从参数increment的大小, sbrk(0) 将返回pragram break 的当前位置。
#include<stdlib.h>
void * malloc(size_t size)
return pointer to allocated memory on success or NULL on error
#include<stdlib.h>
void *free(void * ptr) 在堆上动态分配的内存在使用完毕后要使用free()来进行释放.
将malloc的参数设置为0,函数返回的是一个不是NULL的指针,并且是可以使用的,调用malloc_usable_size (ptr)在linux中显示的值为24.
int main() 4 5 { 6 char *ptr; 7 ptr=(char *)malloc(0); 8 if(ptr==NULL) 9 perror("malloc error:"); 10 *ptr='a'; 11 printf("%c ",*ptr); 12 printf("%d ",malloc_usable_size(ptr)); 13 return 0; 14 }
在堆上分配内存的方法还有
#include <stdio.h>
void * calloc(size_t numitems,size_t size) return pointer to allocated memory on success ,or NULL on error
参数numitems 指定分配对象的数量,size指定每个对象的大小。calloc()会将以分配的内存初始化为0
void * realloc(void *ptr,size_t size) return pointer to allocated memory on success ,or NULL on error
realloc()重新分配已分配内存的大小, 若realloc()增加了已分配内存的大小,不会对额外分配的字节进行初始化。通常情况下,增大已分配内存时,realloc()会试图去合并在空闲列表中紧随其后且大小满足要求的内存块,
若原内存块位于堆的顶部,那realloc()会对堆空间进行扩展。
如果内存位于堆的中部,且紧随其后的内存空间大小不足,realloc()会分配一块新的内存
realloc()可能会移动内存,对这块内存的后续引用就必须使用realloc()的返回指针。
nptr=realloc(ptr,newsize)
if(nptr==NULL)
{/**Handle error/}
else
{
/*realloc succeeded*/
ptr=nptr
}
没有把realloc的返回值直接赋值给ptr,因为一旦调用realloc失败,ptr的值被置为NULL
在栈上分配内存
#include <alloca.h>
void * alloca (size_t size)
return pointer to allocated block of memory
不能在一个函数的参数列表中调用alloca()
func(x,alloca(size),z); /*wrong!!!*/
这样会使alloca()分配的堆栈空间出现在当前函数参数的空间中(函数参数都位于栈帧内的固定位置)
可以写成这样
void *y;
y=alloca(size);
func(x,y,z);
使用alloca()分配的内存会随栈帧的移除而自动释放