我们之前在申请空间时,都是一些固定空间。如果我们后面想调整空间的大小是办不到的。C语言提供了一些函数可以让我们实现这个操作(头文件<stdlib.h>,空间在堆区开辟)。
目录
该函数的功能:开辟一段连续空间。
- size是开辟多少个字节。
- 该函数类型是void*,在使用时要根据实际情况进行类型转换。
- 开辟成功返回指向这一块的指针,失败则返回NULL。
- #include
- #include
- int main()
- {
- int* arr = (int*)malloc(5 * sizeof(int));
- if (arr == NULL)//判断开辟是否成功
- {
- printf("开辟失败");
- return;
- }
-
- return 0;
- }
注意:malloc开辟的空间是未初始化的。
该函数的功能:释放动态开辟的内存。
- ptr是指向动态开辟空间的地址。
- 如果ptr是NULL则不做任何事情。
- #include
- #include
- int main()
- {
- int* arr = (int*)malloc(5 * sizeof(int));
- if (arr == NULL)
- {
- printf("开辟失败");
- return;
- }
-
- free(arr);
- arr = NULL;//避免出现野指针
- return 0;
- }
注意:动态开辟的空间一定要释放,否则会造成内存泄露。这是很严重的问题!
该函数的功能:为 num 个大小为 size 的元素开辟一块空间。
calloc和malloc的功能几乎一样,只是calloc会把空间的每个字节初始化为0。
- #include
- #include
- int main()
- {
- int* arr = (int*)calloc(5 , sizeof(int));
- if (arr == NULL)
- {
- printf("开辟失败");
- return;
- }
-
- free(arr);
- arr = NULL;
- return 0;
- }
该函数的功能:对动态开辟内存的大小进行调整。
- ptr 是要调整的内存的地址。ptr可以是NULL这时候就是创建空间。
- size 调整之后的总字节数。
函数在调整内存空间时有两种情况:
- 情况1:原有空间之后有足够大的空间
要扩展内存就直接原有内存之后直接追加空间,返回原地址即可。
- 情况2:原有空间之后没有足够大的空间
它会在堆区上找一块合适的空间使用,返回新地址。原来的旧空间会被释放。
如果找不到合适的空间返回NULL。
- #include
- #include
- int main()
- {
- int* arr = (int*)malloc(5 * sizeof(int));
- if (arr == NULL)
- {
- printf("开辟失败");
- return;
- }
- int* new = (int*)realloc(arr, 10 * sizeof(int));
- if (new == NULL)
- {
- printf("开辟失败");
- return;
- }
- arr = new;
-
- free(arr);
- arr = NULL;
- return 0;
- }
如果开辟失败。我们对它进行解引用就会出现这种情况,所以我们在使用这块空间之前要检查一下是否为NULL。
free只能对动态开辟的空间进行释放。
传入free的参数要是动态开辟空间的首地址,如果不是首地址就会发生内存泄漏。
同一块内存只能释放一次。为了避免多次释放,我们在释放后把它置为NULL。即使后面我们再次释放这块空间也不会发生错误。
动态开辟的内存在使用完后一定要释放,如果不释放会造成严重的后果。
好了讲到这儿就差不多讲完了,希望你能有所收获。如果有错误的地方请及时指出,有什么不懂的地方可以私信我哈,如果觉得不错那就点点赞吧!