分配内存:malloc()和free()
12.4,p396
1,所有程序都必须留有足够的内存来存储程序使用的数据,这些内存有的是自动分配
float x;
char place[] = "Dancing"
2,可以声明预留
int place[100];
3,malloc()函数
#include <stdio.h>
#include <stdlib.h>
使用malloc()函数的头文件。
int main(void){
int a[5]={4,10,2,8,6};
printf("请输入您需要的数组的长度:len = ");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof (int) * len);
- sizeof(20) 申请20个字节
- int int字节。
- malloc函数只能返回第一个字节地址,无论一个变量占几个字节它都只返回第一个字节地址,
- (int *)强制类型转换,转换成第一个int类型变量的地址
- 写完malloc()就写指针写数组都一样了。
*pArr = 4; //类似a[0]=4
pArr[1]=10; //类似a[1]=10;
printf("%d %d",*pArr,pArr[1]); //我们可以把pArr当作一个普通数组来使用
for(int i = 0;i<len;++i)
scanf("%d",&pArr[i]);
for(i=0;i<len;++i)
printf("%d\n",*(pArr+i));
free(pArr); //把pArr所代表的动态分配的20个字节的内存释放
return 0;
}
malloc()函数
- 接受参数:所需内存字节数;
- malloc会找到合适的空闲内存块,内存块的匿名的,即不会为它赋名;
- 要把地址赋值给一个指针变量,并使用指针访问这块内存;
- 返回值:内存块的首字节字母;
- malloc()可用于返回指向数组的指针、指向结构的指针等。所以通常把返回值强制转换为匹配的类型。
- 指向void的指针赋给指针不用考虑类型。
- 如果内存分配失败,返回空指针。
ptd = (int *)malloc(30 * sizeof(int));
- 为30个int类型的值请求空间;
- 设置ptd指向该位置;
- ptd被声明为指向一个int类型而不是指向30个int类型的块
- 数组名是该数组首元素的地址,让ptd指向首元素,就可以像使用数组名一样使用它。
free()函数
- 参数是个指针,指向malloc()返回的地址
- free()释放malloc分配的内存
- 动态分布,在销毁指针之前,一定要记得释放内存,不然会导致内存泄漏。
创建链表
- 使用malloc()函数为结构分配足够的空间;
- 储存结构的地址;
- 把当前信息拷贝到结构中。
释放链表
- 为每个已经没配的结构都调用free()函数。
链表结点的定义一定要用指针来对结点进行间接访问(每个链表结点,可能会发生删除插入操作,所以注定了结点结构体中的指针肯定会不断的发生变化)
在传入头结点指针给调用函数时,在函数的操作过程中,会给头结点分配内存空间,对其进行修改。
所以我们要用指向头结点指针的指针来作为函数的参数