• 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
    ",*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()分配的内存会随栈帧的移除而自动释放

  • 相关阅读:
    Eclipse下Tomcat插件的安装
    Eclipse插件的安装方法
    tomcat 详解五 tomcat页面设置访问权限
    W3C XML Schema 教程
    vb.net向Excel中写入值
    用VB操作Excel的方法
    怎样用VB自动更新应用程序
    VB读写INI文件的四个函数以及相关API详细说明
    oracle数据库元数据SQL查询
    javascript JTimer_2.0 时间日历控件使用方法
  • 原文地址:https://www.cnblogs.com/zydark/p/7719610.html
Copyright © 2020-2023  润新知