1、传统数组的缺点
(1)数组的长度必须事先指定,且只能是长整数,不能是变量
例子:int a [5 ]; // ok
int len = 5; int a [len ]; //error
(2)传统形式定义的数组,该数组的内存程序员无法手动释放
数组一旦定义,系统就会为该数组分配存储空间会一直存在,除非数组所在的函数运行结束
# include<stdio.h>
void f(void){
int a[5] = {1,2,3,4,5} //当我们写完这之后,程序自动为这数组分配了20个字节的存储空间
//它只能在本函数运行完毕时由系统自动释放,程序员无法释放
}
int main(void){
return 0;
}
(3)数组的长度不能在函数运行过程中动态的扩充或缩小,一旦定义就不能变化
(4)A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕后,则无法被其他函数使用。
2、为什么需要动态分配内存
动态数组很好的解决了传统数组的这4个缺陷
传统数组也叫静态数组
3、动态内存分配举例_动态数组的构造
/*
malloc是内存分配的缩写
*/
# include <stdio.h>
# include <malloc.h> //不能省
int main(void){
int i = 5; //分配了4个字节,系统静态分配 11行
int * p =(int *)malloc(4);
/*
1、要使用malloc函数,必须添加malloc这个头文件
2、malloc函数只有一个形参,并且是整形
3、4表示请求系统为本程序分配4个字节
4、malloc函数为我们分配内存,但只能返回第一个字节的地址
5、12行分配了8个字节,P变量占了4个字节,P所指向的内存也占了4个字节
6、P本身所占的内存是静态分配的,P所指向的内存是动态分配的
*/
*p = 5; //*p代表的就是一个int变量,只不过*p这个整型变量的内存分配方式和11行的分配方式不一样,这个是动态分配的
free(p); //free(p)表示把P所指向的内存给释放掉
return 0;
}