动态数组释放内存,
Yyds干货库存
@TOC
一、动态记忆功能
1.malloc函数
大小代表字节数
如果空间打开成功,将返回该空间的地址。
如果打开空格失败,则返回NULL。
正常情况下,创建10个造型空间应该是
voidp=void malloc(10 sizoef(int));
但是因为void dereference会报告一个错误
so(int)p=(int)malloc(10sizeof(int));
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malo oc(10 * sizeof(int));
如果(p!=空)
int I=0;
for(I=0;我我)
*(p I)=I;
免费(p);
p=NULL
返回0;
}
If free(NULL)表示什么都不做。
2.calloc函数
Num表示元素的数量
大小代表字节数
与malloc函数不同,calloc函数可以将每个元素初始化为0。
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malloc(10 * sizeof(int));
如果(p!=空)
int I=0;
for(I=0;我我)
printf(%d\n ,*(p I));//malloc未初始化为所有随机值。
免费(p);
p=NULL
返回0;
}
#包含stdio.h
#包含stdlib.h
int main()
int*p=(int*)calloc(10,sizeof(int));
如果(p!=空)
int I=0;
for(I=0;我我)
printf(%d\n ,*(p I));//calloc可以初始化全0。
免费(p);
p=NULL
返回0;
}
3.realloc函数
realloc函数是一个扩展空间的函数。
Memblock是前一个的初始地址
增加新空间的大小
realloc返回值有两种情况:
如果后面有足够的空间,则返回原来的初始地址;如果后面空间不够,将返回原地址。
在下面创建一个空间,并将旧空间复制到新空间。旧空间将被返回给操作系统。
返回新空间的初始地址。
当两种情况都不存在,即无法打开新空间时,返回NULL。
int*str=(int*)realloc(p,20 * sizeof(int));//正常情况下只返回P,但是考虑到为NULL时的情况,free(NULL)会什么都不做,造成内存泄漏。
if(str!=空)
p=str
免费(p);
p=NULL
返回0;
}
二、常见的动态内存错误
1.取消对NULL的引用操作
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malloc(10 * sizeof(int);
int I=0;
for(I=0;我我)
*(p I)=I;//如果开拓失败,返回NULL *NULL,则报错。
免费(p);
p=NULL
返回0;
2.跨界进入动态空间
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malloc(10 * sizeof(int));
如果(p!=空)
int I=0;
for(I=0;我我)
*(p I)=I;//打开10个整数空间,试图访问40个整数,会导致越界访问。
免费(p);
p=NULL
返回0;
3.对非动态内存使用释放
#包含stdio.h
#包含stdlib.h
int main()
int arr[10]={ 0 };
int * p=arr//arr是第一个元素,地址在堆栈上。
免费(p);//如果动态内存在堆区的空闲堆栈区,会报错。
p=NULL
返回0;
}
4.用free释放一部分动态内存开发。
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malloc(10 * sizeof(int));
如果(p!=空)
int I=0;
for(I=0;我我)
* p=I;//p指针本身向后移动。释放P后面的空间会导致内存泄漏。
免费(p);
p=NULL
返回0;
}
5.同一块内存的多次释放
#包含stdio.h
#包含stdlib.h
int main()
int * p=(int *)malloc(10 * sizeof(int));
免费(p);
//p=NULL;
免费(p);
//p=NULL;
返回0;
}
在这一点上,它显示了p=NULL的重要性。如果没有这两个p=NULL,将会报告一个错误。
而加free(NULL)就是什么都不做。
6.忘记释放动态打开的空间。
#包含stdio.h
#包含stdlib.h
无效测试()
int * p=(int *)malloc(10 * sizeof(int));
//免费(p);
int main()
test();
返回0;
p是指针变量,但也是局部变量。
由于功能被破坏,malloc创建的10个塑形空间内存泄露。
三、钢笔试题
1.
#包含stdio.h
#包含stdlib.h
#包含字符串. h
空内存(char*p)
p=(char *)malloc(100);
int main()
char * str=NULL
内存(str);
strcpy(str, hello world );
printf(str);
返回0;
}
将报告一个错误
内存函数传递指针,由指针接收或由值调用。
p是一个临时副本,它将和函数destroy 2一起被销毁。
所以即使打开了动态内存,也不能传到str,str还是NULL。
在记忆函数中,局部变量P会随着函数的结束而被销毁。
动态内存打开的100字节内存存在泄漏。
单词
#包含stdio.h
#包含stdlib.h
#包含字符串. h
无效内存(char**p)
* p=(char *)malloc(100);
int main()
char * str=NULL
内存(str);
strcpy(str, hello world );
printf(str);
返回0;
}
第一级指针的地址作为地址调用被第二级指针传递和接收。
动态内存可以返回
2.
#包含stdio.h
#包含stdlib.h
#包含字符串. h
char *内存()
char p[]= hello world ;
返回p;
无效测试()
char * str=NULL
str=memory();
printf(str);
int main()
test();
返回0;
}
将报告一个错误
数组是在堆栈上创建的,随着函数的销毁而销毁。
虽然返回p将H的地址传递给str
但是当输出返回寻找记忆函数时,却找不到了。
非法访问内存。
四。灵活阵列
柔性阵列上至少存在一个成员。
使用sizeof计算大小时,不包括灵活数组的内存。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。