-
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分配的内存是位于堆区的,需要手动释放
-
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
-
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);
-
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); }
-
-
VirtualAlloc和HeapAlloc
-
brk和sbrk
c语言用来手动申请空间的函数(malloc,calloc,realloc,alloca )
最新推荐文章于 2024-07-14 20:25:18 发布