整理自外网英文文献(见参考文献),非商用,仅供学习交流
目录
C语言用malloc()函数和calloc()函数进行动态内存分配。动态分配指代码运行时从堆寄存器分配内存。
什么是malloc()?
malloc()是内存分配函数的缩写,m即memory(内存)。
malloc()动态分配一块(连续)特定尺寸的大容量内存,返回值是个指向分配单元开头的指针,可以指向任何格式的变量。如果内存分配失败,返回空指针。因为malloc()不会自动初始化内存,所以如果不手动初始化变量,很可能造成未定义的行为(undefined behaviour),在多数情况下也就是读取到垃圾值(如果新分配的内存单元曾被分配写入,上次写入的值会保留到本次)。
malloc()需要1个参量,即分配的内存空间的字节数。
例:
int* allocated_with_malloc = malloc(5 * sizeof(int));
sizeof()函数的参量为变量类型名,返回该类型占用的字节数。
什么是calloc()?
calloc()函数中的c代表contiguous(连续),分配特定尺寸的内存(不一定是连续的),并将其初始化为0。和malloc()一样,返回值也是指向内存区域的指针。如果内存分配失败,返回空指针。
calloc()需要2个参量:(1)分配的数据块个数(2)没有数据块的字节数。
例:
int* allocated_with_calloc = calloc(5, sizeof(int));
malloc与calloc的对比
malloc() | calloc() | |
1. | malloc() 创建特定尺寸的单块内存 | calloc()给单个变量分配多块内存 |
2. | 1个参数 | 2个参数 |
3. | 更快 | 更慢 |
4. | 时间效率高 | 时间效率低 |
5. | 可能有垃圾值(如果新分配的内存单元曾被分配写入,上次写入的值会保留到本次) | 分配的内存初始化为0 |
6. | 指内存分配 | 指连续内存分配 |
参考文献
【1】Difference Between malloc() and calloc() with Examples - GeeksforGeeks
【2】Difference Between malloc() and calloc() (byjus.com)
注:【2】提到两个函数的返回值是空指针,是错误的。malloc()和calloc()只在分配内存失败的情况下返回空指针,其他情况下均返回指向空间开头位置的指针。