动态内存开辟

mac2025-05-31  83

对于书写一个c语言程序来说,第一步要做的就是开辟内存空间,其形式为:类型+空间名。例如:int age; Char name; double average ; 这样开辟的空间用来存放待处理的内容,该空间又称为变量,其中存放的内容可以被改变,即可多次被赋予内容,但是,在下一次存入内容的时候,原来的数据将不复存在,变量一旦开辟,便在内存中占一定大小,在非主函数中,该变量随着函数调用开始而开辟,一旦子函数结束,空间自动销毁,待下一次函数调用时,再重新开辟空间,这是就会用到动态内存开辟使得开辟的空间在需要的时候被开辟,用户不用时再销毁释放呢。 C语言中提供了三个动态内存开辟函数。

malloc和free

malloc动态内存开辟函数:

void *malloc(size_t size);

1.这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 2.如果开辟成功,则返回一个执行开辟好空间的指针。 3.如果开辟失败,则返回一个 NULL 指针,因此 malloc 的返回值一定要做检查。 4.返回值的类型是void *,所以 malloc 函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。 free专门是用来动态内存的释放和回收的:

void free(void *ptr);

free 函数用来释放动态开辟的内存。 如果参数ptr指向的空间不是内存不是动态开辟的,那free函数的行为是未定义的。 如果参数ptr是 ULL指针,则函数什么事都不做。

#include <stdio.h> #include <malloc.h> #include<assert.h> int main() { int* ptr = NULL; ptr = (int*)malloc(num * sizeof(int)); assert(ptr != NULL); for(int i =0;i<10;i++) { * (ptr + i) = 0; } free(ptr);//释放ptr所指向的动态内存 ptr = NULL;//这是非常有必要的一步 return 0; }
calloc

malloc动态内存开辟函数:

void *calloc(size_t num, size_t size);

calloc函数的功能是为num个大小为 size 的元素开辟一块空间,并把空间的每个字节初始化为0. 与malloc的区别只在于calloc会在返回值之前把申请的空间的每个字节初始化为0.

#include<stdio.h> #include<stdlib.h> #include<assert.h> int main() { int *p=calloc(10,sizeof(int)); assert(p!=NULL) for(int i =0;i<10;i++) { * (p + i) = 0; } free(p); p = NULL; return 0; }

所以如果我们对申请的内存空间的内容要初始化,那么可以很方便的使用calloc函数来完成任务。

realloc

realloc函数的出现让动态内存的管理更加灵活 有时我们发现过去申请的空间太小了有时我们觉得申请的空间太大了,那为了合理时候的内存,我们一定会对内存的大小做灵活的调整,那realloc函数就可以做到对动态开辟内存大小的调整。 函数原型:

void *realloc(void *ptr, size_t size);

#include <stdio.h> #include <malloc.h> #include<assert.h> int main() { int* ptr = (int *)malloc(100); assert(ptr != NULL); //扩展容量 int* p = NULL; p =(int *) realloc(ptr, 1000); if (p != NULL) { ptr = p; } free(ptr); return 0; }

realloc函数在调整内存时存在两种情况: 1:原有空间之后有足够大的空间,要扩展的内存就直接在原有内存之后追加空间,原有空间的数据不发生变化。 2:原有空间之后没有足够大的空间,在堆空间上找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。

在使用malloc、calloc、realloc函数时一定要记住用free函数释放内存,不然就会造成内存泄漏的问题。

最新回复(0)