可以这样理解,使用 malloc 函数的为动态的,不使用 malloc 函数的为静态的。
# include <stdio.h>
# include <malloc.h>
int main(void)
{
//静态数组
//其中 a 指向 a[0] 的地址。
int a[5] = {4,10,2,8,6};
//动态分配
int len;
printf("请输入您需要分配的数组长度:len = ");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof(int) * len);
*pArr = 4; //相当于 a[0] = 4;
pArr[1] = 10; //类似于 a[1] = 10;
printf("%d %d",*pArr,pArr[1]); // 4 10
free(pArr);
return 0;
}
sizeof(int):返回 int 的字节数,即 4。
malloc(sizeof(int) * len):假设用户输入的 len 为 5,则 字节长度一共为 4 * 5 = 20 字节,即向系统申请 20 字节内存空间。
(int *):前置转换。
使用前置转换的原因:
malloc() 函数只能返回第一个字节地址,第一个字节地址是没有实际含义的,因为不能根据第一个字节地址确定当前变量占多少个字节。
无论一个变量占几个字节,都是以第一个字节来表示的。
所以加上 (int *) 来告诉编译器, malloc() 返回的第一个字节的地址是 int 地址。pArr 指向前 4 个字节,pArr[1] 相当于指向了后4个字节,依次类推。由此可将 pArr 当做一个数组来处理,即动态数组。
free(pArr):把 pArr 所代表的动态分配的 20 个字节内存释放。