内存的动态开辟
在C语言中,对于一些数组的大小有时候我们并不知道需要开辟多大的一块内存空间,所以这时候我们就需要动态的去开辟一块内存空间。
C语言中动态开辟内存的函数有malloc、calloc、realloc、释放内存的函数有free
C++中可以用运算符new来开辟内存,用delete释放内存。
malloc:
原型:void *malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存。
返回值:如果分配成功返回指向被分配内存的指针,失败返回NULL。
calloc:
原型:void *calloc(size_t n, size_t size);
其功能、返回值和calloc一样。
区别是:malloc分配的空间不初始化,calloc自动初始化为0.
realloc:
原型: void *realloc(void *mem_address, unsigned int newsize);
功能:对原来的空间进行扩大。realloc先判断当前指针是否有连续的足够的空间,如果有,扩大当前指针指向的空间,并将原指针返回;如果没有,先申请一块扩大后的空间,然后将原来的内存中的数据拷贝到新的内存空间,再释放原来指针指向的空间,返回新申请空间的指针。
返回值:成功,返回一个申请的空间的指针,失败,返回NULL。
free:
原型:void free(void *ptr);
功能:释放由以上函数申请的内存空间,一般和上面的函数配对使用,否则会造成野指针。
intmain(){//int*p=(int*)malloc(20);intsize=5;int*p=(int*)malloc(sizeof(int)*size);int*q=(int*)calloc(size,sizeof(int));int*p_tmp=p;int*q_tmp=q;if(p==NULL||q==NULL){exit(1);}for(inti=0;i<size;i++){intn=*p_tmp;printf("%d",n);p_tmp++;}cout<<endl;for(inti=0;i<size;i++){intn=*q_tmp;printf("%d",n);q_tmp++;}int*new_p=(int*)realloc(p,sizeof(int)*10);if(new_p==NULL){exit(1);}p=new_p;free(p);free(q);system("pause");return0;}
结果:
new:
功能:动态分配空间
delete:
功能:释放空间
用法:
1)int *p = new int; delete p;
动态开辟sizeof(int)个字节。
2)int *p = new int(n); delete p;
动态开辟sizeof(int)个字节,并初始化为n。如果n缺省,则初始化为0。
3)int *p = new int[10]; delete[] p;
动态开辟10*sizeof(int)个字节的内存空间。
intmain(){int*p=newint(5);int*q=newint[10];for(inti=0;i<10;i++){q[i]=i;}printf("paddr:%p\n",p);printf("%d\n",*p);printf("qaddr%p\n",q);for(inti=0;i<10;i++){printf("%d",q[i]);}deletep;delete[]q;system("pause");return0;}
结果:
malloc与new的区别:
1、malloc是C/C++标准库函数,而new是C++运算符。
2、new和delete在对象创建和消亡时会自动执行构造涵数和析构函数。而malloc则不会。对于一些非内部数据类型来说,显然用new和delete更合适。
3、new只能用于C++中,C程序则只能用malloc.C++程序两者都可用。
4、new出来的指针是直接带类型信息的,而malloc出来的指针都是void*类型的,使用时一般需要强转。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。