在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);
功能:释放由以上函数申请的内存空间,一般和上面的函数配对使用,否则会造成野指针。
int main() { //int *p = (int*)malloc(20); int size = 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(int i = 0;i结果:
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)个字节的内存空间。
int main() { int *p = new int(5); int *q = new int[10]; for(int i = 0;i<10;i++) { q[i] = i; } printf("p addr:%p\n",p); printf("%d\n",*p); printf("q addr %p\n",q); for(int i = 0;i<10;i++) { printf("%d ",q[i]); } delete p; delete[] q; system("pause"); return 0; }结果:
malloc与new的区别:
1、malloc是C/C++标准库函数,而new是C++运算符。
2、new和delete在对象创建和消亡时会自动执行构造涵数和析构函数。而malloc则不会。对于一些非内部数据类型来说,显然用new和delete更合适。
3、new只能用于C++中,C程序则只能用malloc.C++程序两者都可用。
4、new出来的指针是直接带类型信息的,而malloc出来的指针都是void*类型的,使用时一般需要强转。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
文章标题:内存的动态开辟-创新互联
链接地址:http://cdkjz.cn/article/dhdicp.html