内存分配函数:
malloc函数--分配内存块,但是不对其进行初始化。
calloc函数--分配内存块,并且对其进行初始化(清0)。
realloc函数--调整先前分配的内存块大小。
函数原型:
void* malloc(unsigned size);
void* realloc(void* ptr, unsigned newsize);
void* calloc(size_t numElements, size_t sizeOfElement);
参数说明:
(1)malloc函数:参数size为需要分配的内存空间的长度。
(2)realloc函数:参数ptr为原有的空间地址,newsize是重新申请的地址长度。
(3)calloc函数:参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数。
验证代码:
#include <stdio.h>
#include <stdlib.h>
#define ALLOT_SIZE 40 //分配长度
int main(void)
{
int i = 0; //分配了4个字节,静态分配
int len = ALLOT_SIZE;
int *p,*q;
//malloc
//在内存的动态存储区中分配一块长度为len字节的连续区域,返回该区域的首地址
p = (int *)malloc(len);
if(NULL == p)
{
printf("malloc failed");
}
printf("malloc address:%p\n",p);
for(i = 0; i < len / sizeof(int); i++)
{
printf("malloc result%d:%d\n",i,p[i]);
}
printf("\n");
//calloc
//在内存中申请ALLOT_SIZE*sizeof(int)字节大小的连续地址空间
q = calloc(ALLOT_SIZE,sizeof(int));
if(NULL == q)
{
printf("calloc failed");
}
printf("calloc address:%p\n",q);
for(i = 0; i < ALLOT_SIZE / sizeof(int); i++)
{
printf("calloc result%d:%d\n",i,q[i]);
}
printf("\n");
//malloc初始化
memset(p,-1,len);
printf("malloc address:%p\n",p);
for(i = 0; i < len / sizeof(int); i++)
{
printf("result%d:%d\n",i,p[i]);
}
printf("\n");
//realloc
//给一个已经分配了地址的指针重新分配空间
p = realloc(p,len * 2);
if(NULL == p)
{
printf("realloc failed");
}
//memset(p,0,len * 2);
printf("realloc address:%p\n",p);
for(i = 0; i < len * 2 / sizeof(int); i++)
{
printf("realloc result%d:%d\n",i,p[i]);
}
//释放空间
free(p);
free(q);
}
动态的内存分配适用于所有类型的数据,但是主要用于字符串、数组和结构。利用动态分配,可以设计出能根据需要扩大或缩小的数据结构,例如表、树或者其他数据结构。
静态内存和动态内存的比较
静态内存是由系统自动分配、自动释放 。
静态内存是在栈分配的 。
动态内存是由程序员手动分配、手动释放 。
动态内存是在堆分配的。