动态内存分配 Memory
C函数库<stdlib.h>
定义了malloc()
和free()
两个函数用于动态内存分配。当我们需要一个长度在运行时才能确定的数据类型(例如数组)时,动态分配内存是十分关键的。此外,合理使用内存分配可以减少程序运行时内存开销。
M-1 malloc()
malloc()
在内存池中提取一块特定大小的内存,将内存的起始位置作为指针返回给调用者,以便于使用这块分配出来的内存。被分配出来的内存并未进行任何初始化。
malloc()
的原型定义为void *malloc(size_t size);
,它接受的参数是需要分配的字节数量,类型为size_t
(此特殊类型也同样是在<stdlib.h>
中被定义)。它的返回值类型是void *
,这意味着往往需要显式地进行强制类型转换。
malloc()
函数所分配的内存块是连续的。如果操作系统无法满足malloc()
函数的需求,malloc()
函数的返回值是NULL
。所以使用malloc()
返回的指针之前可能需要检查其是否为NULL
。
M-2 free()
free()
函数原型定义为void free(void *pointer);
。它接受一个指针作为参数,无返回值。此指针来源于malloc
(或calloc
、realloc
),free
函数会释放先前释放的内存,这一片内存将会归操作系统管理。在这之后,原先指向新分配内存的指针将会变为野指针,因此最好重新赋值。
向free()
传递一个NULL
指针不会有任何效果。向free
函数传递一个并非由malloc()
分配出来的指针,其结果是未定义的。
M-3 更多函数:calloc和realloc
calloc
和realloc
是另外两个内存分配函数。
calloc
与malloc
的作用相似,但是calloc
在分配内存之前会先初始化为0。calloc
的函数原型为void *calloc( size_t num_elements,size_t element_size);
,它接受两个参数:元素的数量、单个元素的大小(字节数量)。calloc
会自行计算总共需要分配的字节数量。
realloc
函数用于修改已分配内存块的大小,原型为void realloc(void *ptr,size_t new_size);
,将新分配的内存块添加到原先内存块的最后面,或者是重置该内存块尾部的部分内存。
M-4 使用分配的内存
由于malloc
接受的参数即要分派的字节数量,因此可以直截了当地这样分配:array = malloc(100);
但是这么做影响了程序的可移植性,在不同的机器上运行,你可能得到的是一个25个元素的数组,可能不是,取决于int
占用的字。因此,使用sizeof()
往往能提供更准确的实现。
下面的例子利用malloc
分配内存,创建一个拥有5个元素的数组:
int *array,nvalues=5;
array = (int *)malloc(nvalues * sizeof(int));
在分配完成后,最好检查一下分配是否成功。如果malloc
没能成功分配内存(一般情况下这不太可能发生),返回的指针值是NULL
。
if(array == NULL)
{
printf("Error!Out of memory.");
exit(1);
}
array接受一个指针值,类似于其他的数组名,可以像往常一样使用间接访问、指针运算、下标来访问其元素。
array[1] = 10;
printf("array[1] == %d\n",array[1]);
/*
*使用array[]
*/
free(array);
array = NULL;
本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ