数组的长度必须事先指定,只能是常整数,不能是变量
传统形式定义的数组,该数组的内存程序员无法手动释放,只能在定义>该数组的函数使用完毕后,释放数组占用的内存。
数组的长度一旦定义,其长度就不能更改。
传统形式定义的数组不能跨函数使用。
动态内存分配可以很好的解决传统数组的缺点。
传统数组也被称之为静态数组。
malloc函数介绍:
malloc是memory(内存)allocate(分
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int i = 5;//分配了4个字节,静态分配
/*
1、要使用malloc这个函数,必须添加malloc.h这个头文件
2、malloc函数只有一个形参,并且形参是整型。
3、4表示请求系统为本程序分配4个字节
4、malloc只能返回第一个字节的地址,虽然系统为它分配了4个字节
5、p所指向的内存空间占4个字节,
所以14行的执行使用了内存中8个字节
6、p本身所占的内存是静态分配的,p所指向的内存是动态分配的。
*/
int * p = (int *)malloc(4);
/*
p代表一个int变量,
是不同于int i = 5;中,
i静态分配的内存空间。
*/
*p = 5;
/*
free(p)表示把p所指向的内存空间给释放掉,
而p本身所占的内存空间是静态分配的,
才会释放p本身所占的内间
*/
free(p);
return 0;
}
虽然malloc函数返回的第一个字节的地址,无法表明p指向的内存单元>的具体位置,
但是用int *进行类型强制转换可以,表明等号右端是一个整型变量的地>址,而不是第一个字节的地址。
等号左端的指针变量也就指向了整个的这4个字节合起来的一大块内存
内存单元。
举例说明:
malloc(200);//向系统申请分配200个字节的变量存储单元。
如果malloc(200)前面用的是char *强制类型转换,即
(char *)malloc(200);则表示200个字符的变量
(int *)malloc(200);//表示50个整型的变量
(double *)malloc(200)//表示25个双精度型变量
另外对于动态分配的的指针数组,比如整型的指针数组,
每移动一次,移动的不是一个字节,而是4个字节
这是因为整型的指针变量数组中的指针变量指向的
第一个内存单元(int类型本身占4个字节)占4个字节,
等到这个指针变量移动一位,相当于数组下标加1,
其实就指向了第二块占4个字节(整型数据对应的内存单元)的内存单元
比如:
int len = 5;
int * p;
p = (int *) malloc(len *sizeof(int));
此处的p实际上指向了在内存空间中占20个字节的内存单元的前4个
字节,如下图所示