c语言用来手动申请空间的函数(malloc,calloc,realloc,alloca )

  1. malloc:

    void *malloc(size_t size );//原型
    
    • malloc分配在堆区,需要free
    • malloc分配空间没有默认初始化值
    • memset是讲目标缓冲区的字符设置为c字符,是按照字节设置的,一半设置空字符(0)。
    • malloc申请空间失败返回NULL
    #include<stdlib.h>//或者<malloc.h>
    #include<memory.h>//包含memset函数,或者使用<string.h>,而wmemset包含在<wchar.h>中
    
    void *memset(void *dest,int c,size_t count );//memset原型
    wchar_t *wmemset(wchar_t *dest,wchar_t c,size_t count);//wmemset原型
    
    int *a = (int *)malloc(sizeof(int));
    memset(a,0,sizeof(int));//malloc分配的内存并不会自动初始化
    free(a);//malloc分配的内存是位于堆区的,需要手动释放
    
    
  2. calloc:

    void *calloc( size_t num, size_t size);//原型
    
    • calloc分配在堆区,需要free
    • calloc会初始化分配每一位为0
    • calloc返回一个由某种对象组成的数组,而malloc返回一个对象(二者参数不同,实际没啥区别)
    • calloc申请空间失败返回NULL
    #include<stdlib.h>//或者<malloc.h>
    
    int *arr = (int *)calloc(2, sizeof(int));
    printf("%d, %d\n", *arr[1],arr[2]);//输出 0 0
    
  3. alloca/_alloca:

     void *_alloca( size_t size );//原型 
    
    • _alloca在栈区分配空间,不需要free
    • 和malloc一样,空间没有初始化,一样可使用memset
    • _alloca申请空间超过栈区大小会崩溃
    #include<stdlib.h>//或者<malloc.h>
    #include<memory.h>
    int *a = (int *)_alloca(sizeof(int));//alloca是_alloca的宏
    memset(a, 0, sizeof(int)); printf("%d\n", *a);// 0
    free(a);
    
  4. realloc

    void *realloc(void *memblock, size_t size);//原型
    
    • realloc在堆区分配内存并返回一指向重分配内存的void * 指针。

    • 如果realloc的size为0相当于将memblock的空间还给堆

    • 如果memblock指向的空间大于size,则多于size的部分会失去

    • 如果memblock指向的空间小于size且memblock后面连续字节个数足够,realloc会试图直接从后面的字节扩展。如果空间不够,realloc会另找一块空间复制memblock的内容,然后返回新空间的指针。

    • realloc申请空间失败返回NULL

    #include<stdlib.h>//或者<malloc.h>
    int *a, *b;
    if ((a = (int *)malloc(sizeof(int))) == NULL)
    	exit(0);
    if ((b = realloc(a, sizeof(int) * 10)) == NULL)
    	exit(0);
    if (a == b) { free(b); a = NULL; }
    else { free(a); free(b); }
    
  5. VirtualAlloc和HeapAlloc

    不同内存分配方式的区别 VirtualAlloc HeapAlloc malloc new

  6. brk和sbrk

    系统调用与内存管理(sbrk、brk、mmap、munmap)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值