数组的缺陷:
1、数组长度必须事先定义,只能为常整数,定义后无法更改;
2、数组占用内存,无法手动释放,直到数组所在函数执行完毕;
3、函数内的数组,一旦函数执行完毕后,则不能在其它函数中使用,即数组不能跨函数使用;
其实,数组所存在的问题就是静态内存的问题,通过动态分配数组可以很好的解决上述问题。
malloc函数:
函数名:malloc
头文件:malloc.h
功能:内存分配
用法:(void*)malloc(unsigned size);
返回:所分配内存空间的第一个内存单元的地址
例子:int *p = (int*)malloc(4)
构造动态一维数组:
int *p = (int*)malloc(len);len是个int型变量。
请求系统分配len个字节的内存空间,并把空间第一个字节的内存地址转化成int型地址,然后赋给p。
结合数组下标和指针的概念,就相当于动态造了一个名为p,长度为len/4的int型数组(因为int型占个4个字节,所以长度为len/4)。
补:把第一个内存地址转化成int型,就表示第一个内存地址指向了连续的4个字节(因为int型占4个字节),赋值给p后,p就指向第一个连续的4个字节,p+1指向第二个的4个字节,换句话说就是把这段空间按四个字节为单位划分,每四个字节中的第一个字节的内存地址就指向它所在的四个字节,这同样也是下标的本质。
静态内存与动态内存的比较:
静态内存由系统自动分配,由系统自动释放,静态内存是在栈中分配的。
动态内存由程序员手动分配,手动释放(所以要注意内存泄露),动态内存是在堆中分配的。
调整已分配动态内存大小:
函数名:realloc
头文件:malloc.h
功能:重新分配内存
用法:(void*)relloc(void* ptr, unsigned size)
例子:int *p = (int*)realloc(p, 100);