
9.2.2 动态内存分配
C99里可以用变量定义数组大小,而C99之前人们使用动态内存分配:
malloc函数
malloc(size_t size) ; 返回的类型是void* (因为类型是无法传递的),需要额外类型转换
要使用该函数需要包含<stdlib.h>头文件
向malloc申请的空间大小是以字节为单位,要申请多少,括号里写数量*sizeof(需要的类型int/short/double)
a=(int*)malloc(number*sizeof(int));
//因为malloc默认返回 void*,(int*) 是类型转换
使用结束后要释放申请的空间,使用free()函数
返回的结果是void*,需要转换为自己需要的类型(类型是人为将数值定义的种类)
eg:要申请数量为n,int类型的,返回类型为int*的空间给一个指针变量a
int *a; a=(int*)malloc(n*sizeof(int));
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int number;
int *a;
int i;
printf("请输入变量:");
scanf("%d",&number);
//C99可以直接写 int a[number];
a=(int*)malloc(number*sizeof(int));
//读入数据
for(i=0;i<number;i++)
{
scanf("%d",&a[i]);
}
//倒序输出(从下标-1即最大值开始输出)
for(i=number-1;i>=0;i--)
{
printf("%d",a[i]);
}
free(a);//申请了一块空间,现在需要释放。程序将指针当作数组用,所以直接释放a即可
return 0;
}
申请失败
如果申请内存失败则会返回0(或者称为NULL)
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
void *p;
int cnt=0;
while((p=malloc(100*1024*1024)))//每次申请100M的空间 交给p
//malloc(100*1024*1024)
//(p=malloc(100*1024*1024)) 看malloc的结果是不是0,是1的话while就执行
{
cnt++;
}
printf("分配了%d00MB的空间\n",cnt);//14600
return 0;
}
while((p=malloc(100*1024*1024)))
这条语句同时做了两件事,第一:申请100MB空间给p;第二:将p值作为while条件
这样在申请失败,也就是没有可申请空间时循环停止,可以得出系统最大可分配的内存值。
free()
俗话说有借有还,再借不难,free函数的作用就是将借来的内存空间还给系统,
只能还申请来的空间的首地址!!!//p++了 不能free
申请过的空间最终都是需要还回去的 原封不动!
free(NULL);
完全没问题,相当于啥也没做。
或者是形成一个习惯:定义指针时,先给指针赋0值。如果没有申请或者申请失败,此时就free(NULL,free(0)
常见问题
申请了却没有free
后果是长时间运行内存会逐渐减少
新手可能是忘记了
进阶者可能是找不到合适的free时机
free了多次
会崩溃
地址改变后直接free
比如申请的是指针p,执行free(p++)会提示p++所指的变量没有申请
因此有一个malloc就要配套一个free。需要对程序结构有一定的规划,还需要一些经验。