内存的动态分配
需要使用#include<stdlib.h>
- malloc-申请动态空间
- 函数原型:voidmalloc(size_t,size);*
- 向系统中申请分配size个字节的内存空间,并返回一个指向这块空间的指针。由于返回类型为void,可以转换为任何类型,函数调用失败会返回NULL,如果size参数设为0,返回值也可能为NULL。
#include <stdio.h>
#include <stdlib.h> //调用malloc函数所需的头文件
int main(){
int *prt,i,num;
printf("how many number do you want?\n");
scanf("%d",&num);
prt=(void*)malloc(num*sizeof(int));//申请分配的内存大小
printf("please put in some number:\n");
for(i=0;i < num;i++){
scanf("%d",&prt[i]);
}
printf("you number is:\n");
for(i=0;i<num;i++){
printf("%d",*(prt+i));
}
[^1]:不同机器对于各类型大小定义不同,因此最好使用sizeof()函数求类型大小
free-释放参数指向的内存空间
函数原型-void free(voidptr)*
该空间必须是由malloc,calloc,或realloc函数申请的,若ptr参数为NULL,则不执行任何操作
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *ptr,i,num;
scanf("%d",&num);
ptr=(int*)malloc(num* sizeof(int));
printf("put in %d numbers",num);
scanf("%d",ptr);
free(*ptr);
printf("%d",*ptr);
}
该函数不会修改prt参数的值,所以调用后仍然指向原方向,但是变成非法空间。
内存溢出
如果申请内存的时候在循环中,就会造成反复申请的情况,以至于内存大量损耗得不到释放,因此要格外注意。
calloc函数-向系统申请分配
可以使malloc函数少一步初始化为0的过程
realloc-修改ptr指向的内存
函数原型-voidrealloc(voidptr)realloc((voidptr)size_t,size)*
先判断当前的指针是否有足够的连续空间,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照你指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来ptr所指内存区域,同时返回新分配的内存区域的首地址,即重新分配存储器块的地址。(注意:原来指针是自动释放,不需要使用free,但是使用realloc函数改变过的函数结束后,需要用free释放空间)
int *prt, i, num;
printf("how many number do you want?\n");
scanf("%d", &num);
prt = (void *) malloc(num * sizeof(int));
printf("please put in some number:\n");
for (i = 0; i < num; i++) {
scanf("%d", &prt[i]);
}
prt = (void *)realloc(*prt,(num+1)* sizeof(int));
⚠️
-
要确保新分配的内存大于原来的内存,否则可能会导致数据的丢失
。
当内存分配成功后,指针会返回一个void,此时可以把它强制转化为其他类型,如果分配不成功。 -
如果ptr的参数为NULL,那么调用该函数相当于调用malloc(size)
-
如果ptr的参数为NULL,且size为0,那么调用该函数相当于调用free函数
-
除非ptr的参数为NULL,否则它必须由先前调用的malloc,calloc,或realloc的返回。