为什么使用动态内存分配?
声明一个数组时,必须指定数组长度,但是数组长度往往在运行时才知道,如果程序使用的元素数量超过了声明的长度,它就无法处理这种情况。显而易见,数组声明得更大一些,但是程序实际需要的元素数量比较少时,大部分内存空间就被浪费了。动态内存分配允许程序为一个长度在运行时才知道的数组分配内存空间。
c函数库提供了几个函数,malloc,calloc, realloc 和 free,分别用于执行动态内存分配和释放。
malloc函数
malloc原型:void *malloc(size_t size)
用法 : 当一个程序需要一些内存时,它就调用malloc函数,malloc分配一块合适的内存,并向该程序返回一个指向这块内存的指针。当一块分配的内存不再使用时,程序调用free函数把它返还给系统。
a、
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p = (int *)malloc(10 * sizeof(int));//在内存中申请了一个10个int这么大的空间。
free(p);//释放通过malloc分配的内存。
return 0;
}
b 、将一个长度为10的数组元素赋值为0
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *arr = (int *)malloc(10 * sizeof(int n));
for (int i = 0; i < 10; i++)
{
arr[i] = 0;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
calloc函数
calloc原型:void *calloc(size_t n,size_t size)
用法 : 上面的 b 还有另一个方法,那就是用calloc函数,malloc和colloc 主要区别除过参数有所差别外,后者在返回指向内存的指针之前把它初始化为0。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *arr = (int *)calloc(10,sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
运行结果:
realloc函数
realloc原型:void realloc(void *ptr,size_t new_size)
用法 : realloc函数用于修改一个已经分配的内存块大小,使用这个函数,可以使一块内存扩大或者缩小。
a、扩容&缩容
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p= (int *)malloc(10*sizeof(int));
for (int i=0;i<10; i++)
{
p[i] = 10 * i;
}
int *q = (int *)malloc(20 * sizeof(int));
for (int i = 0; i < 10; i++)
{
q[i] = p[i];
}
p = q;//更新地址
q = NULL;
printf("%d\n", p);
p = (int *)realloc(p, 5* sizeof(int));
printf("%d\n", p);
p = (int *)realloc(p, 40* sizeof(int));
printf("%d\n", p);
return 0;
}
运行结果:
这个结果说明:缩容地址不变;扩容地址改变。
b、
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p= (int *)malloc(10*sizeof(int));
for (int i=0;i<10; i++)
{
p[i] = 10 * i;
}
int *q = (int *)malloc(20 * sizeof(int));
for (int i = 0; i < 10; i++)
{
q[i] = p[i];
}
p = q;//更新地址
q = NULL;
for (int i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
printf("\n");
return 0;
}
b^ 、
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p= (int *)malloc(10*sizeof(int));
for (int i=0;i<10; i++)
{
p[i] = 10 * i;
}
p = (int *)realloc(p, 20 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
printf("\n");
return 0;
}
b与b^效果等效
运行结果: