在c99之后,数组的长度可以是变量
int num=1;
int a[num];
scanf("%d\n",&num);
在c99之前,要使用malloc函数
malloc函数是包含在stdlib.h的一个函数,该函数可以申请一定大小的内存空间,其需要的参数是size_t(有点想整数但不是整数),返回类型是void*
int num;
int *a;
scanf("%d",&num);
a=(int*)malloc(num*sizeof(int));
malloc函数要的不是多少个int或者是其他类型,而是具体的字节数,num*sizeof(int)就是把一个int所占的字节数(4)乘上num,而malloc返回的值是void*,而a是int*,因此要对malloc返回的类型值进行强制类型转换
由于数组和指针是一样的,因此在上面的代码之后,就可以把a当作数组在做,包括遍历,赋值等
int i=0;
for(i=0;i<num;i++)
{ sancf("%d",&a[i];}
当结束对malloc申请的内存使用后,要归还内存free (a);
free函数时和malloc配套的函数
但是归还的空间只能是申请时的首空间。例如当申请到一个空间后,对该指针进行的加减运算
free(a);
当申请的内容空间大于最大的可用空间时,malloc函数就会返回0或者null
有的时候指针没有初始化并且没有申请到内存,此时free该指针可能会出现该指针的初始值时一个重要的且不可以随便改变的地址被free,导致程序崩溃。但是free函数可以free(0)或者free(null)。因此在声明一个指针时就先使其初始化为0
常见问题
申请了内存忘记free——>长时间运行内存会下降
free了又free一次——>崩溃
地址变更过(指针运算)后free变更后的地址而不是原始的首地址——>崩溃
解决方案
牢记malloc-free,有mollac必有free
在构建程序时就想好大致的框架,包括free内存的地方
多看别人的代码,多写自己的代码,编程是实践,纸上得来终觉浅