动态内存分配

来源:互联网 发布:sql语句添加列 编辑:程序博客网 时间:2024/06/10 12:33

一:malloc 和 free

malloc : 执行动态内存分配。当一个程序需要一些内存时,我们最初会直接把内存大小给定,其实还有第二种方法就是先向内存中利用malloc函数申请一片合适并且连续的内存,并返回这片内存的地址(不初始化内容)。

free : 在使用完之后,切记使用free函数将前面申请的空间释放掉,否则会有很大程度上的内存浪费以及泄露。


函数原型如下(都在stdlib.h中声明)

void *malloc(size_t size);

size代表的是你想要分配的内存字节数,如果开辟成功就返回对应地址。所以在开辟的同时我们最好检查是否开辟成功,也就是检查返回的指针是否为NULL,不要直接使用这片空间。

void free( void *pointer );

free的值必须是NULL或者就是一个从申请内存后返回的值。

注意:free参数为NULL时不会产生任何效果。


#include <stdio.h>#include <Windows.h>#include <errno.h>int main(){int *p = malloc(INT_MAX);if(p == NULL){printf("%s\n",strerror(errno));}free(p);system("pause");return 0;}

为了突出效果!我们先申请了一片大小为INT_MAX大的空间,这片空间可是相当大了,而且mallo还必须申请一片连续的,那就基本上不可能了,在我们之后想要使用p指针时,就得先检查下是否申请成功,我们使用strerror(errno),当我们有错时他会将对应错误信息报出来,所以对应结果就是如下,告诉我们没有足够大的空间。



注:如果我们想申请20个存储整数的内存,我们可以写成

int *p = malloc ( 20 * sizeof ( int ) );


二:calloc 和 realloc

calloc : 与malloc不同的是,calloc在返回指向申请成功内存的指针之前把这片空间都初始为0

realloc : 用于修改一个原先已经分配的内存块的大小。如果使用这个函数扩大内存块,之前的内容也都会被保留,新增加的内容添加到原先内存块的后面,新内存并不会进行初始化;若进行缩小时,该内存块尾部多余部分就会被拿掉

如果原先的内存块无法改变大小,realloc将重新分配一块正确大小的内存,并把以前内存块中的内容拷贝过来。所以就要注意使用realloc后,就不能再使用指向旧地址的指针,应该使用返回的新指针,并对旧地址进行释放。

函数原型:

1.void *calloc ( size_t num_elements , size_t element_size);

size_t num_elements指的是所申请内存元素的个数,size_t element_size为每个元素的字节数。

2.void realloc(void *ptr , size_t new_size)

void *ptr为旧地址的指针,size_t new_size为你希望新的内存块总字节大小。


例子如下~:

1. calloc:

#include <stdio.h>#include <Windows.h>#include <errno.h>int main(){int *p = calloc(10,sizeof(int)); //申请了一块 10*sizeof(int)大小的空间并初始化为0if(p == NULL){printf("%s\n",strerror(errno));}free(p);system("pause");return 0;}
我们可以看看内存里是否初始化:


很棒!连续的大小为40字节的空间并同时初始化为0。


2.realloc

#include <stdio.h>#include <Windows.h>#include <errno.h> int main() { int *p = malloc(5*sizeof(int)); int i = 0; int *tmp = NULL; if(p == NULL) { printf("%s\n", strerror(errno)); return 0; } tmp = realloc(p, 40); if(tmp != NULL) p = tmp; free(p); return 0; }
先申请一片大小为20字节的空间,再扩大到40字节。我们观察内存来看看:



第一张图是我们先申请的20个连续字节,之后又通过realloc函数扩大到40字节。



原创粉丝点击