chapter 7 内存分配函数

#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\n",*ptr);
 12         printf("%d\n",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()分配的内存会随栈帧的移除而自动释放

posted @ 2017-10-23 22:37  快第三个十年  阅读(134)  评论(0编辑  收藏  举报