日期:2023-12-5
一:个人认为使用动态开辟内存的优势
(1)可以控制内存的大小:
动态开辟内存可以自由根据用户需求调节内存空间,既可以保证数据不会溢出,也能保证不会浪费多余的内存空间。
(2)不占用栈区的内存
动态开辟内存是向堆区申请了一个连续的并且比较大的内存空间,动态内存分配的空间是在堆区申请的,不是在栈区申请的。
如果是在栈区定义了变量,而且每个变量分配内存时,又存在一定的间隙,容易造成了定义的变量足够多时,空隙也会很多,即变相地浪费了申请的内存空间。而使用动态开辟内存,是向系统申请一个自由变化空间。所以动态内存在堆区申请,就完全不必担心栈区的空间不够的问题。
二:个人在调用动态申请内存时遇到的一些问题和思考
(1)开辟步骤
动态数组开辟:
void *malloc(unsigned size)
if ((p = (int*)malloc(n*sizeof(int))) == NULL)
{ printf("Not able to allocate memory. \n");
exit(1); }
动态数组开辟并初始化:void *calloc(unsigned n, unsigned size)
内存释放:void free(void *ptr)
内存分配调整:void *realloc(void *ptr, unsigned size)
注意:malloc()对所分配的存储块不做任何事情;calloc()对整个区域进行初始化。
(2)开辟差异和理解上的侧重点
a = malloc(sizeof(int));
a =(int *) calloc(n,sizeof(int));
这两者的差别不仅仅是函数的不同,其中后者有强制类型转换,而前者没有
实际上在C语言的标准上,有无强制类型转换都是行的(当然在c++必须将强制类型转换)
因为无论是calloc还是malloc,他们的返回值都是void* ,这里的void*实际上可以转换为int*类型或者其他类型,就是说返回的指针是兼容所有类型的万能指针。
指向void型的指针可以指向任意类型的对象,是一种特殊类型的指针。