知识点回顾
1. malloc 可以申请一块任意尺寸的内存空间
malloc 不仅可以申请存储基本数据类型的空间,事实上它还可以申请一块任意尺寸的内存空间。对于后者,由于申请得到的空间是连续的,所以我们经常用数组来进行索引即可:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr = NULL;
int num, i;
printf("请输入待录入整数的个数:");
scanf("%d", &num);
ptr = (int *)malloc(num * sizeof(int));
for (i = 0; i < num; i++)
{
printf("请录入第%d个整数:", i+1);
scanf("%d", &ptr[i]);
}
printf("你录入的整数是:");
for (i = 0; i < num; i++)
{
printf("%d ", ptr[i]);
}
putchar('\n');
free(ptr);
return 0;
}
程序实现如下:
2. 初始化内存空间
由于 malloc 并不会帮你初始化申请的内存空间,所以你需要自己进行初始化。
当然你可以写一个循环来做这件事儿,但我不建议你这么做,因为标准库提供了更加高效的函数:memset。
3. calloc
calloc 函数在内存中动态地申请 nmemb 个长度为 size 的连续内存空间(即申请的总空间尺寸为 nmemb * size),这些内存空间全部被初始化为 0。
calloc 函数与 malloc 函数的一个重要区别是:
· calloc 函数在申请完内存后,自动初始化该内存空间为零
· malloc 函数不进行初始化操作,里边数据是随机的
calloc 函数详细文档 -> 传送门
4. realloc
以下几点是需要注意的:
· realloc 函数修改 ptr 指向的内存空间大小为 size 字节
· 如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!
· 该函数将移动内存空间的数据并返回新的指针
· 如果 ptr 参数为 NULL,那么调用该函数就相当于调用 malloc(size)
· 如果 size 参数为 0,并且 ptr 参数不为 NULL,那么调用该函数就相当于调用 free(ptr)
· 除非 ptr 参数为 NULL,否则 ptr 的值必须由先前调用 malloc、calloc 或 realloc 函数返回
realloc 函数详细文档 -> 传送门




