文章目录
前言
一、malloc()
void * malloc(size_t size)
向内存申请一块连续可用的空间,并返回指向这块空间的指针
开辟成功,返回一个指向开辟好空间的指针
开辟失败,返回一个NULL指针
返回值的类型是void*,使用的时候需要自己再强转
二、free()
void free(void* ptr)
释放开辟的内存
如果ptr是NULL指针,则函数什么都不做
如果ptr指向的空间不是动态开辟的,free函数的行为是未定义的
三、calloc()
void* calloc(size_t num,size_t size)
为num个size大小的元素开辟一块空间,并把空间的每个字节初始化为0
四、realloc()
void * realloc(void* ptr,size_t size)
可以做到对动态开辟内存大小的调整
ptr是要调整的地址
size是调整之后的新大小
返回值为调整之后内存起始位置
函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
五、动态内存开辟的常见错误
1.对NULL解引用
开辟的空间失败,返回NULL,没有进行判断直接进行解引用
解决方法:对开辟空间返回的指针进行判断
int * p =(int *) malloc(100000000000);
*p=20; 出现问题
free(p);
解决方法:
if(p!=NULL){
*p=20;
}
2.对开辟的内存空间越界访问
3.使用free()释放非动态开辟的空间
4.使用free()释放动态内存中的一部分
5.对同一块内存多次释放
6.动态开辟的空间忘记释放----内存泄漏
六、笔试题
1.

2.

3.

4.

七、柔性数组
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做“柔性数组”成员
struct S{
int i; //其他成员
int a[0]; 或者 int a[]; //柔性数组成员
};
*柔性数组成员前面必须至少有一个其他成员。
*sizeof()返回的结构大小不包括柔性数组的内存
*包含柔性数组成员的结构,用malloc()进行内存的动态分配,并且分配的内存应该大于结构大小,以适应柔性数组的预期大小
柔性数组使用
struct S{
int i; //其他成员
int a[0]; //柔性数组成员
};
//期望a的大小是10个整型
struct S * ps= (struct S *) malloc(sizeof(struct S)+10*sizeof(int));
ps->i=10;
int j=10;
for(j=0;j<10;j++){
ps->a[j]=j;
}
//增加
struct S * s=(struct S*)realloc(ps,sizeof(struct S)+20*sizeof(int));
if(s!=NULL){
ps=s;
}
1536

被折叠的 条评论
为什么被折叠?



