§举例1:
/*malloc是memory(内存) allocate(分配)的缩写动态内存空间是怎么造出来的?
*/
#include <stdio.h>
#include <malloc.h>
{
int i = 5; //分配了4个字节,静态分配
int * p = (int *)malloc(100);
*
1. 要使用malloc函数,必须要添加malloc.h头文件
2. malloc函数只有一个形参,并且形参是整型
3. 100表示请求系统为本程序分配100个字节
4. malloc函数只能返回第一个字节的地址,但此时并不能确定该变量的类型,只有将这个地址被强制类型转化成存
放整型变量的地址,这时才传达出指向整型变量的信息。
5. 系统总共分配了104个字节的内存空间,p变量本身占4个字节(静态分配),p所指向的内存占100个字节(动态分
配) 若为int 则可存25个int类型变量(25*4字节),若为char则可存100个变量(100*1字节)。
6. p本身所占的内存是静态分配的,p所指向的内存是动态分配的
*/
free(p);
//free(p)表示把p说指向的内存空间给释放掉,
//p本身的内存不能释放,只有main函数终止时,由系统自动释放
*p = 5;
//*p代表的就是一个这int变量,*p这个整型变量的内存分配方式和int i =5;不同。
//*p是内存是动态分配的, int i是静态的。
printf("*p=%d\n",*p);
printf("同志们好!\n");
return 0;
}
运行结果:#include <stdio.h>
#include <malloc.h>
void f(int * q) //q是p的拷贝或副本 q等价于p *q等价于*p *q=200则*p=200
{
//*p = 200; //error f()没有p变量,p是在main()函数定义的
// q = 200; //error q是指针变量(地址),200是整数int
*q = 200; //OK!类型一致
// * *q 语法错误 !*q整型变量, 只有指针变量前可以加*
//free(q);//把q指向的内存释放掉
}
int main(void)
{
int * p = (int *)malloc(sizeof(int));//sizeof(int)=4;
*p = 10;
printf("%d\n", *p); //10
f(p); //p保存的是地址
printf("%d\n", *p); //情况1:200
//情况2: f()函数中 free(q)作用后,则输出 -572662307(垃圾值)
//printf("%d\n", **p); //语法错误
return 0;
}
运行结果:200/*目的:动态一维数组示例
realloc(pArr, 100)
//扩充动态内存空间 (原来50变100;原来150变100)
//保留原来动态内存中未被截取的内容
*/
#include <stdio.h>
#include <malloc.h>
int main(void)
{
//int a[5]; //系统静态地分配20个字节的空间给数组a
int len;
int *pArr;
printf("请输入你要存放的元素个数:" );
scanf ("%d", &len);//5
pArr = (int *)malloc(4*len);//pArr指向这20个字节动态空间的前4个字节
/*
动态的构造了一个一维数组,该数组的长度len, 数组名是pArr, 数组元素类型是int
类似与int pArr[len]; len可以根据需要变化
*/
//对一维数组进行操作,如:对动态一维数组进行赋值
for (int i=0; i<len; ++i)
scanf("%d", &pArr[i]);
printf("动态数组元素为: \n");
//对一维数组进行输出
for(i=0; i<len; ++i)
printf("%d\n", pArr[i]);
free(pArr);//动态空间被释放
printf("%d\n", *(pArr+1));
//动态空间被释放,原来动态数组数元素内容为垃圾值-572662307
return 0;
}