您的位置:首页 > 编程语言 > C语言/C++

C++内存操作

2013-08-19 17:48 169 查看
C中内存分配与释放函数如下所示:
1 malloc函数
extern void* malloc(unsigned int num_bytes)

函数的功能是分配长度是num_bytes字节的内存块,如果分配成功则返回指向

分配内存的指针,如果分配失败返回空指针

注意

如果不再使用的内存可以使用free函数释放掉

C,C++规定,void*类型可以强制转换为任何其它类型的指针

void*表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是

用这段空间来存储什么类型的数据。

malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内

存中,其值将是随机的。

typedef struct data_type{

 int age;

 charname[20];

}data;

data* bob;

bob=(data*)malloc(sizeof(data));

if(bob!=NULL){

 bob->age=22;

 strcpy(bob->name,"Robert");

 printf("%sis%dyearsold\n",bob->name,bob->age);

}else{

 printf("mallocerror!\n");

 exit(1);

}

free(bob);

内存泄漏实例:

#include<stdio.h>

#include<malloc.h>

#define MAX 100000000

int main(void){

 int* a[MAX];

 inti;

 for(i=0;i<MAX;i++){

  a[i]=(int*)malloc(MAX);

 }

 return0;

}

2 calloc函数
void* calloc(unsigned n,unsigned size)

函数功能:在内存的动态存储区中分配n个长度为size的连续空间,函数返回

一个指向分配起始地址的指针,如果分配不成功,返回NULL。

跟malloc的区别:calloc在动态分配完内存后,自动初始化分配空间为零,

而malloc不初始化,里面的数据是随机的垃圾数据。

例子:

#include<stdlib.h>

#include<string.h>

#include<stdio.h>

int main(void){

 char*str=NULL;

 /*分配内存空间*/

 str=(char*)calloc(10,sizeof(char));

 /*将hello写入*/

 strcpy(str,"Hello");

 /*显示变量内容*/

 printf("Stringis%s\n",str);

 /*释放空间*/

 free(str);

 return0;

}

#include<stdio.h>

#include<stdlib.h>

int main(void){

 int i;

 int* pn=(int*)calloc(10,sizeof(int));

 for(i=0;i<10;i++)

  printf("%3d",*pn++);

 printf("\n");

 free(pn);

 return0;

 }

输出十个0

3 realloc函数
extern void* realloc(void* mem_address,unsigned int newsize)

函数功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到

新分配的内存区域,而后释放原来的mem_address所指内存区域,同时返回新

分配的内存区域的首地址

如果重新分配成功则返回指向被分配的内存指针,否则返回空指针NULL

#include<stdio.h>

#include<stdlib.h>

int main(){

 int i;

 int* pn=(int*)malloc(5*sizeof(int));

 printf("%p\n",pn);

 for(i=0;i<5;i++)

 scanf("%d",&pn[i]);

 pn=(int*)realloc(pn,10*sizeof(int));

 printf("%p\n",pn);

 for(i=0;i<5;i++)

 printf("%3d",pn[i]);

 printf("\n");

 free(pn);

 return0;

}

#include<syslib.h>

#include<alloc.h>

int main(){

 char*p;

 clrscr();

 p=(char*)malloc(100);

 if(p)

  printf("MemoryAllocatedat:%x",p);

 else

  printf("NotEnoughMemory!\n");

 getchar();

 p=(char*)realloc(p,256);

 if(p)

  printf("MemoryReallocatedat:%x",p);

 else

  printf("NotEnoughMemory!\n");

 free(p);

 getchar();

 return0;

}

1.realloc失败的时候,返回NULL

2.realloc失败的时候,原来的内存不改变,不会释放也不会移动

3.假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内

存+剩余内存,realloc还是返回原来内存的地址;假如原来的内存后面没有足

够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝

到新内存里,原来的内存将被free掉,realloc返回新内存的地址

4.如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行

释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防

内存泄露。

5.传递给realloc的指针必须是先前通过malloc(),calloc(),或realloc()分配的

6.传递给realloc的指针可以为空,等同于malloc。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: