申请内存
1. malloc函数:
a) 使用原因:当我们不知道数组长度时,通过申请内存块而创建一种可以节省内存的做法(动态申请数组)
b) 使用格式:
#include<malloc.h>//(malloc在<stdlib.h>中声明)
int *p,*q;//(定位所申请的内存)
P=(int*)malloc(size);//(如果不强制转换就返回无类型指针,指向起始位置;如果内存空间不够分配则返回NULL---意味着对返回的指针检查非空是重要的)
q=p;//(q存放初始地址)
p++;//(下一个数组变量)
free(q);//(释放内存---参数是先前malloc,calloc,realloc返回的指针或者空指针(无影响))
2. calloc函数:
a) 参数:(元素数量,每个元素字节数 )—类型是size_t,它是一个无符号类型在<stdlib.h>
b) 原型:void *calloc(size_t num_elements,size_t element_size);
c) 和malloc区别:是在calloc在返回值指向内存的指针之前把他初始化为0
3. realloc函数:
a) 效果:修改一个原先已经分配的内存块大小,加长时保留原有的数据,新内存在后面未经初始化;缩小时尾部被拿掉但前面的依旧不变;但是使用realloc后应该相应地用realloc返回的新指针。
b) 原型:void realloc(void *ptr,size_t new_size)
c) 特例:当realloc的第一个参数是NULL,行为就和malloc一样申请一个新的连续内存
4.free函数
a)使用效果:释放存储空间
b)原型:void free(void*p);
c)说明易错点:
<1>.free的指针参数只能是最后一次调用的malloc或者calloc所返回的地址
eg.下例中所free的是q而非p,是因为执行p++后p已经改变,在执行free会出错
#include<malloc.h>//(malloc在<stdlib.h>中声明)
int *p,*q;//(定位所申请的内存)
P=(int*)malloc(size);//(如果不强制转换就返回无类型指针,指向起始位置;如果内存空间不够分配则返回NULL---意味着对返回的指针检查非空是重要的)
q=p;(q存放初始地址)
p++;//(下一个数组变量)
free(q);//(释放内存---参数是先前malloc,calloc,realloc返回的指针或者空指针(无影响))
<2>.保存数据的空间释放后数据也将不存在,再用指针输出是不可预料的值
使用内存
eg.初始化:
**/*创建内存*/**
int *pi;
pi=malloc(25*sizeof(int));
if(pi=NULL){//NULL提示我们测试的是指针而不是整数
printf(“out of memory!\n”);//超出内存池
exit(1);
}
**/*初始化1*/**
Int *pi2,i;
pi2=pi;
for(i=0;i<25;i++){
*pi2++=0;
}
**/*初始化2*/**
Int i;
for(i=0;i<25;i+=1){
pi[i]=0;
}
动态内存常见错误
- 对NULL指针进行解引用操作
- 对分配内存操作时越界
- 释放非动态分布内存
- 试图释放一块动态内存的一部分
- 一块动态内存被释放后继续使用
/注意/ - 检查返回的指针不是NULL,确保成功分配了
- 操作内存超出了分配内存的边界