C语言之内存分配函数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /************************************************************* * C语言之动态内存分配函数malloc,calloc,realloc,memset * * malloc: void *malloc(size_t size) * 包含在库函数stdlib.h中,作用是在内存的堆区分配一个大小为size * 的连续空间,如果分配内存成功,函数返回新分配内存的首地址,否则, * 返回NULL,一般在写程序需要判断分配内存是否成功,使用完内存后要及 * 时释放内存。 * calloc:void *calloc(size_t num,size_t size) * 作用是在内存中分配连续大小为num*size的空间,这一点在动态数组内存 * 分配有所体现,如果分配内存成功,函数返回新分配内存的首地址,否则, * 返回NULL。 * malloc与calloc区别: * 1、calloc在返回指向内存的指针之前把它初始化为0。 * 2、请求内存数量的方式不同。malloc的参数仅仅是需要分配的 * 内存字节数;calloc的参数包括元素的数量和每个元素的字节数。 * memset:void* memset (void*p, int c, size_t n); * 作用:将指针p指向的n个字节的内存全部赋值为c。可以对malloc分配的 * 内存进行初始化 * * realloc void* realloc (void* ptr, size_t size) * 改变ptr所指内存区域的大小为size长度,如果重新分配成功则返回指向 * 被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用 * free()函数将内存块释放。有一点需要注意:当分配内存成功之后,应 * 将原本的指针ptr=NULL,否则会形成野指针,可能造成系统崩溃。 * * 提示:不论是以上那种方式申请内存,在申请内存之后,最终都要用free释放空间, * 不然会造成内存泄漏。但是内存只能释放一次,不能多次调用free函数。 *************************************************************/ int *pm, i; pm = (int*)malloc(sizeof(int)*100); if(NULL != pm) { printf("使用malloc分配的存储空间\n"); for(i=0; i<100; i++) { printf("%d\t", *pm++); if((i+1)%10 == 0) printf("\n"); } printf("\n"); free(pm); pm = NULL; } int *pc; pc = (int *)calloc(100, sizeof(int)); printf("使用calloc分配的存储空间\n"); for (int i=0; i<100; i++) { if(NULL != pc) { printf("%d\t", *pc++ ); if((i+1)%10 == 0) printf("\n"); } } printf("\n"); free(pc); pc = NULL; int *pms = (int *)malloc(sizeof(int)*100); if(NULL != pms) { memset(pms, 0, 100 ); } printf("使用memset分配的存储空间\n"); for (int i=0; i<100; i++) { if(NULL != pms) { printf("%d\t", *pms++ ); if((i+1)%10 == 0) printf("\n"); } } printf("\n"); free(pms); pms = NULL; printf("使用realloc分配的存储空间\n"); int *pre = (int *)malloc(sizeof(int) * 50); if (NULL != pre) { pre = (int *)realloc(pre,sizeof(int)*100); if (NULL != pre) { for (i=0; i<100; i++) { printf("%d\t", *pre++); if((i+1)%10 == 0) printf("\n"); } } } printf("\n"); free(pre); pre = NULL; return 0; }
使用malloc分配的存储空间 4138720 4133928 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3027544 8 1465662020 1870093388 1886612338 1550148449 1869440356 1650803804 710698869 -2147450880 -2147450880 -2147450880 1543503964 11955 4138720 4133952 -2147450880 -2147450880 -2147450880 -2147450880 -2147450880 -2147450880 -2147450880 -2147450880 使用calloc分配的存储空间 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 使用memset分配的存储空间 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 使用realloc分配的存储空间 4133528 4133824 4133880 538976288 402653208 11933 4132712 4128964 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 538976288 -14671840 1684957440 1601402735 134217736 11964 4139504 4128964 1113340483 1765954646 1700027502 1551070323 1953721961 1886153825 1634427745 1666999655 1869375859 1818846823 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0