C语言动态内存开辟

C语言动态内存开辟

在我们日常的编码中,经常使用的开辟内存方式是直接在静态区开辟一个变量,这里我们开辟的空间有两个很大的局限性,我们必须知道我们要开空间的大小,不然我们没办法开,而且比如我们开了一个数组,我们就必须申明数组的大小,不然我们没办法告诉编译器要开多少。可是当我们类似要实现一个顺序表之类的时候,他是要随时插入数据的,这种开辟方式显然不适合我们使用,这里C语言提供了一个动态开辟内存的办法。
我们都知道堆区是很大的,同时静态区并没有很大而且要开的数量是静态的,那我们可以自己在堆上开辟空间,直接开辟我们需要的数量,需要了再继续开。不用了再把它释放掉以免内存泄漏。这就是C语言动态内存开辟。

malloc函数

C语言提供了自己在堆上开辟空间的函数,函数名是malloc
- 函数的返回值类型是void*类型,我们一般将他强转成需要的指针类型,例如 :

ptr=(int*)malloc(sizeof(int)*n);

函数就会给ptr返回开辟好的空间的指针,如果我们没有设置强转类型编译器就不知道我们需要什么类型就会报错。
- 函数存在开辟成功与开辟失败,如果开辟成功返回指向地址的指针,如果开辟失败将会返回空指针,所以我们每一次开辟后要检查是否开辟成功。
- malloc的参数是你要开的字节大小,我们一般先用sizeof算出所需要的类型大小然后乘以个数。

free函数

free函数是与malloc配套的函数,malloc在堆上开辟空间后我们使用这段空间后要进行销毁,不然会造成内存泄露。所以我们用free函数进行销毁。
- free函数的参数是我们开辟的指针地址,比如我们刚刚开的ptr进行销毁:

free(ptr);
  • 如果malloc开辟空间成功那么我们用free可以销毁掉,如果没有开辟空间那么我们free函数是没有意义的,什么也不做。
  • free与malloc在C语言中都属于stdlib.h头文件

calloc函数

一般来说我们开了空间都是要初始化的,这个一般封装在初始化函数中,可是我们还有一个calloc函数可以用来开辟空间并且完成初始化。
- calloc与malloc一样返回类型都是void*类型
- calloc函数的参数是需要开辟的个数以及数据类型大小例如:

ptr=(int*)calloc(5,sizeof(int));
  • calloc会将开辟的每一个字节初始化为0方便我们使用

realloc

当我们开辟空间的时候经常只是知道自己大致需要多少空间,有的时候总会存在开的大了与开的小了的情况存在,开的小了我们放不下,开的大了造成浪费而且有可能不够,这个时候我们就需要一个函数来灵活操纵开辟空间的大小。
- realloc函数的作用是调节开辟空间的大小
- 接受的参数是已经开辟空间的指针与重新需要开辟空间大小例如:

cur=(int*)realloc(ptr,5);

这里代表我们对于ptr已经开出来的空间大小不满意,重新开一个大小是五个int型的空间出来。
这里需要注意的是realloc重新开辟出来的空间在内存上有两种方式,如果我们需要追加的大小在原来的内存后边还有足够大的空间那么直接在原来的空间后面接着,这里返回的指针地址将会是一样的,如果我们需要的新的空间过大导致后面的空间不够那么我们就需要将前边的内容拷贝一份然后放到一个新的地址空间。

malloc与new的区别

malloc是一个函数,他的头文件是stdlib,而且我们需要强转类型来设置我们想要的类型,可是new是C++的一个关键字,所以我们用malloc的时候需要包头文件stdlib.h,用new的时候需要编译器支持。当new开辟内存失败的时候会抛出bac_alloc异常,而malloc失败的时候会返回空指针,并且我们需要在malloc的参数计算我们需要开辟的大小,然而new是自己计算好需要的大小,从内存上说,malloc是存在堆空间的,而new开出来的空间是存在自由存储区的。

我们用malloc的时候需要注意内存泄露的问题,每一次开空间后都要及时检查是不是开成功,用完后记得释放空间,不然都会导致内存泄露的问题。

猜你喜欢

转载自blog.csdn.net/qq9116136/article/details/80490141