1.使用标准库函数在C程序中动态分配内存:malloc(),calloc(),free()和realloc()
数组是单个类型的固定数量值的集合。在使用之前,需要先声明数组的大小。然而有时声明的数组大小可能不足,要解决此问题,可以在运行时手动分配内存(即动态内存分配)。
在<stdlib.h>库下,有四个函数:malloc(),calloc(),realloc()和free()
1) malloc()代表内存分配
该malloc()函数保留指定字符数的内存块。并且返回一个类型的指针void,可以将其转换为任何形式的指针。
语法:
int *ptr = (cast-type *) malloc(byte-size);
例子:
int *ptr = (int *) malloc(100 * sizeof(int));
int大小为4个字节,此语句分配400个字节的内存。并且,指针ptr保存分配的存储器中的第一个字节的地址。如果空间不足,分配将失败并返回NULL指针。
2)calloc()代表连续分配
malloc()函数分配单个内存块,calloc()分配多个内存块并将它们初始化为零。
语法:
int *ptr = (cast-type *)calloc(n, element-size);
例子:
int *ptr = (float *) calloc(25, sizeof(float));
在内存中为25个元素分配连续空间,每个元素大小为4个字节。
3)free()释放内存中分配的空间
语法:
free(ptr);
示例1:malloc()和free(),计算用户输入的n个数字的总和。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, i, *ptr, sum = 0;
printf("输入的元素总个数:");
scanf("%d", &n);
ptr = (int *)malloc(n * sizeof(int));
//或者使用calloc()申请内存
//ptr = (int *)malloc(n, sizeof(int));
if (ptr == NULL)
{
printf("申请内存出错了!");
exit(0);
}
printf("输入元素:");
for (i = 0; i < n; ++i)
{
scanf("%d", ptr + i);
sum += *(ptr + i);
}
printf("输入元素的和是:%d\n", sum);
free(ptr);
return 0;
}
4) realloc()函数
如果动态分配的内存不足,可以通过realloc()函数更改先前分配的内存大小
语句:
int ptr = realloc(ptr, x)
示例2 realloc()
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr, i, n1, n2;
printf("输入数组大小:\n");
scanf("%d", &n1);
ptr = (int *)malloc(n1 * sizeof(int));
printf("已经分配的内存地址:");
for (i = 0; i < n1; ++i)
printf("%p \n", ptr + i);
printf("\n输入新的数组大小:");
scanf("%d", &n2);
ptr = realloc(ptr, n2 * sizeof(int));
printf("新分配的内存地址:");
for (i = 0; i < n2; ++i)
printf("%p \n", ptr + i);
return 0;
}
翻译自
c动态内存分配