C语言中常用的几个内存申请函数

参考:https://blog.csdn.net/lgibsion/article/details/66609495

C语言中常用的几个内存申请函数:

void* malloc(unsigned size); 
void* realloc(void* ptr, unsigned newsize); 
void* calloc(size_t numElements, size_t sizeOfElement);
  •  

以上函数都在头文件stdlib.h中定义,因此使用时必须导入该头文件。

malloc: 
一般我们在平常写代码中用得最多的就是malloc函数了,其参数size是需要申请的内存长度,单位为字节,如果申请失败则返回NULL,否则返回申请到连续内存块的首地址,需要将返回的首地址指针强制转换成目标类型的指针。如:

char *p = (char*)malloc(10);
  •  

realloc: 
realloc是给一个已经申请了内存的指针重新分配内存,即当一个指针指向的内存块不够或有多余时可以使用realloc为其重新分配合适大小的内存,相对于可以根据需要调整内存块的大小。参数ptr为原有的空间地址,newsize是重新申请的地址长度。 
如:

char *p = (char *)malloc(10);
p = realloc(p, 20);
  •  

最终p指向的地址可能不变,也可能变了,但是p指向的内存块大小变大了,而且p原来内存块内的内容不变。 
(重新分配内存后p指向的地址可能会变,变不变是根据实际情况而定的,如果重新分配的内存比原来的大,而且在内存中原来内存块紧跟着的后面有足够的空闲空间可供分配,则p的首地址不变,如果内存中原来内存块紧跟着的后面没有足够的空间可供分配,则系统会从其他地方寻找一段足够大的空闲空间来分配给p,这种情况下p指向的地址就会改变了,原因就是因为不管是malloc还是realloc,其申请的内存块都必须是连续的)。

calloc: 
calloc跟malloc差不多,但calloc比malloc多做了一步操作,就是将申请到的内存块全部初始化为0。参数numElements表示元素个数,sizeOfElement表示每个元素的大小,即calloc申请的内存块大小是numElements * size_t sizeOfElement 字节。

以上函数都是从堆上申请内存,所以需要程序猿自己释放内存,释放内存:

free(void*ptr);

猜你喜欢

转载自blog.csdn.net/fu6543210/article/details/82414905