动态分配内存1的两个视频:
很多编译器是不支持这样创建变长数组的:(gcc支持C99标准的 gcc test.c -std=c99)
#include<string.h> //sterror
#include<errno.h> //errno
#include<stdio.h>
#include <stdlib.h> //malloc
int* p=(int*)malloc(10*sizeof(int));
//malloc不是想分配多少就是多少的!如果开辟失败,返回一个NULL指针,因此malloc的返回值一定要做检查
if(p==NULL)
{
printf("%s\n",strerror(errno));
//sterror可以把错误码对应的错误信息打印出来
}
else
{
//正常使用空间。
for(int i=0;i<10;i++)
{
*(p+i)=i; //感悟到了顺序表的动态分配的意思!!
}
for(int i=0;i<10;i++)
{
printf("%d",*(p+i));
}
free(p);//注意资源是有限的,借完了要还回去!当动态申请的空间不再使用时,要返回给操作系统
//free: <stdlib.h>与<malloc.h>
//虽然空间还回去了,但是p现在依然有能力找到这个空间 如果要让p彻底断开联系 p=NULL;
return 0; //程序生命周期到了,其实也会还回去。否则都不敢写程序了,写一个少一块内存。
}
今天有人来我问问题,问:那动态分配怎么体现的动态?
在这个意义上,malloc申请的内存是在程序运行时才申请而不是事先申请好的,所以叫“动态”。
在malloc申请好的内存中添加数据不会使系统自动调整相关内存尺寸,除非你设计程序来调整,比如发现数据量超出预先定义尺寸则重新申请一块大些的内存,并将原来的数据存放过来,再释放原先malloc的内存;这些操作类似于realloc函数的功能。如果再想复杂和智能只能编程序实现了