1.动态内存(在堆内存分配,堆很大,超过1G):
①根据变量定义数组的长度
②需要较大的内存
③需要长时间(即突破函数的限制)的使用内存
2.动态内存常用的四个函数:
①malloc:申请动态内存
标准形式:int *p = (int )malloc(nsizeof(int));
②calloc: 默认所有的元素置0
标准形式:int *p = (int *)calloc(n,sizeof(int));
③realloc:扩容
标准形式:int *p = (int *)realloc(p,sizeof(int));
④free:释放动态内存,不释放会出现内存泄漏
标准形式:free§;
3.内存泄漏很麻烦(在工作中也是一件很麻烦的事情):
①很难发现
②很难找
4.泄漏的内存被回收的情况:
①程序(进程)结束
②关机
5.void的用法:
①void :没有,主要修饰返回值,表示没有返回值
②void *:通用指针(可以代替任何一个指针),没有类型信息,仅仅标记地址
6.在创建动态内存后,p就可以当数组使用
int main(void)
{
int n = 10;
int *p = (int *)malloc(n*sizeof(int));
assert(p != NULL);
if(p == NULL)
return 0;
for(int i=0;i<n;i++)
{
p[i] = i+1;
}
for(int i=0;i<n;i++)
{
printf("%d\n",p[i]);
}
return 0;
}
7.如何创建一个n个长度的double数组
int main()
{
int n;
scanf("%d",&n);
double *p = (double *)malloc(n*sizeof(double));
assert(p != NULL);
if(p == NULL)
return 0;
return 0;
}
8.验证动态内存的大小(结果可以显示"成功了")
int main()
{
char *arr = (char *)malloc(1024*1024*1020*sizeof(char));
assert(arr != NULL);
printf("成功了\n");
getchar();
return 0;
}
9.不能用定义str[]数组,然后返回str地址的形式,因为函数已结束,局部变量就被收回了,这时所指向的地址保存的内容就不是想要的内容了
char *GetMemory()
{
char *str = (char *)malloc(100*sizeof(char));
strcpy(str,"hello world");
return str;
}
int main()
{
char *p = GetMemory();
printf("%s\n",p);
free(p);
return 0;
}
10.calloc的应用:
int main()
{
int n = 10;
int *p = (int *)calloc(n,sizeof(int));
for(int i=0;i<n;i++)
{
printf("%d ",p[i]);
}
return 0;
}
11.realloc的应用:
如果内存不足,需要更大的内存:
①申请更大的内存(买个更大的房)
②迁移数据(搬家)
③释放原来的内存(卖旧房)
④更新地址(变更家庭地址)
int main()
{
int n = 10;
int *p = (int *)malloc(n*sizeof(int));
assert(p != NULL);
for(int i=0;i<n;i++)
{
p[i] = i;
}
int *q = (int *)malloc(2*n*sizeof(int));
assert(q != NULL);
for(int i=0;i<n;i++)
{
q[i] = p[i];
}
free(p);
p = q; q = NULL;
free(p);
free(q);
printf("%d\n",p);
p = (int *)realloc(p,n/2*sizeof(int));
printf("%d\n",p);
return 0;
}