malloc
void malloc(size)
size类型是unsigned int,为字节数。
int* p1=(int*)malloc(5); //在堆区中申请5Byte的内存空间,将首字节地址赋给p1,后面就可以通过p1去访问这块内存空间
//如果申请失败,malloc函数返回NULL,通常原因是系统堆区空间不够造成的
if(NULL == p1)
{
printf("动态申请内存空间失败!\n");
return 1;
}
calloc
calloc(n,size)
分配n个,每个size字节。
int a1[5]; //栈区数组
int* const a2=(int*)calloc(5,sizeof(int)); //堆区数组
int* const a3=(int*)malloc(5*sizeof(int)); //和上面完全等效
free
堆区空间申请了不释放, 运行时会导致内存泄露,运行完了会导致内存浪费。重启可以解决。
void free(void *ptr)
- 其参数必须为malloc或calloc的返回值,基类型任意。
- 不能释放一部分,只能释放整体。
- 只需要释放一次,不要多重释放。
bzero
bzero(str,size)清零,size为清零的长度
Char* str=malloc(1001);//堆区数组
bzero(str,1001);
Char str2[1001];//栈区数组
bzero(str2,sizeof(str2));
memset
memset(str1,97,n);
将指定str1指向的内存区域的前n个字节以char写入,第二个参数是int型,但是必须0-255之间, 会自动转换成unsigned char。
memcpy
int i=0x41424344;
memcpy(str,&i,sizeof(int));
把&i的内存空间拷贝给str,长度为sizeof(int)。
void* menccpy(void* dest,const void* src,int c,size_t n);
第一个参数是目标,第二个是源,第三个是字符,第四个是长度。
拷贝的时候会检查c是否出现,如果有则返回该位置的下一个字节地址。没有则返回0。
memmove(和memcopy功能完全一样,但是它允许目标内存空间和原内存空间存在交叉,效率稍低点)参数是:目标,源,长度。
realloc
扩充空间:如果后面的内存不够,操作系统会将整体搬移到位置足够的地方,返回首地址。
realloc(p1,500); 将p1的空间扩充到500(是到500不是加500)
realloc内部实现的基本原理:
void* realloc(void* src, size_t new_size)
{
void* p=malloc(new_size);
memcpy(p,src,old_size);
free(src);
return p;
}