c++基础知识(4)
来源:互联网 发布:淘宝代做课程设计 编辑:程序博客网 时间:2024/06/06 07:16
在c++当中,常常会使用动态内存,其中经常使用的是malloc,calloc,realloc。
使用_msize()函数可以获得指针指向的内存空间大小,例如int p=(int )malloc(4*sizeof(int));cout<<_msize(p);
malloc的使用方法int p=(int )malloc(4*sizeof(int));malloc函数的参数是想要开辟的空间大小,函数的返回值是void *,所以在实际使用当中往往会对函数的返回值进行类型转换,得到自己想要的指针类型。当没能成功开辟空间的时候,函数的返回值是NULL,因此在实际使用当中malloc结束后,往往会对返回值进行检验,防止对空指针进行操作。 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
calloc的使用方法是int p1 = (int )calloc(sizeof(int),10);calloc函数与malloc函数相似,都是用于新开辟内存空间,参数有两个,一个是申请地址的单位元素长度,另一个是申请的元素的个数。Calloc与malloc的另外一个不同之处在于malloc不能初始化开辟的内存空间,而calloc会将所分配的内存空间中的每一位初始化为零,也就是说,如果是为字符类型或者整型数据类型分配内存,那么这些元素将保证被初始化为零;如果是为指针类型元素分配内存,那么这些元素通常会被初始化为空指针;如果是为实型数据分配内存,那么这些元素将被初始化为浮点类型的零。
realloc的使用方法是int p = (int )malloc(10 * sizeof(int)); p = (int )realloc(p, 100 sizeof(int));realloc是从堆上分配内存的。当用户试图扩大一块内存空间的时候,realloc会从堆上现存的数据后面的空间进行空间的扩大。如果有足够的空间给用户扩大,那么自然可以成功扩展空间;如果空间不够,那么会用堆上选择第一个足够大的空间分配给用户,并将原有的数据拷贝至新的内存空间,并将原来的数据空间释放。也就是说,在realloc的执行过程中有可能会产生数据移动。如果用户试图使用realloc缩小空间,那么被缩小的部分的数据自然会丢失。
#include<iostream>#include<cstdlib>using namespace std;int main(){ int *p = (int *)malloc(10 * sizeof(int));//p指向一个大小为10个int的内存空间 if (p==NULL){ cout << "error"; return 0; } cout << _msize(p) << endl;//_msize(p)返回指针p指向的内存空间大小 cout << p << endl; p=(int *)realloc(p, 2*sizeof(int));//给p重新分配空间为2个int大小 cout << _msize(p) << endl; cout << p << endl; p = (int *)realloc(p, 100 * sizeof(int));//给p重新分配空间为100个int大小 cout << _msize(p) << endl; cout << p << endl; //cout << *p << endl; free(p);//释放p int *p1 = (int *)calloc(sizeof(int),10);//给p1分配10个int大小的内存,初始化为0 *(p1 + 2) = 1; cout << *p1 << endl; p1++; cout << *p1 << endl; p1++; cout << *p1 << endl; p1++; cout << *p1 << endl; return 0;}
输出结果
400083D5C08 0083D5C0400008411800010
- C语言的公共基础知识(4)
- C/C++基础知识4
- 【C】C程序设计(第4版)基础知识整理
- C/C++基础知识总结4
- c语言基础知识回顾4
- [C++]基础知识备忘(1)
- C语言基础知识(1)
- c++builder 基础知识(一)
- C语言基础知识(一)
- C语言基础知识(二)
- C语言基础知识(三)
- C语言基础知识(四)
- c编程(一)基础知识
- C语言程序设计(一)-基础知识
- 【C/C++】点滴基础知识(EOF,sscanf)
- C 基础知识
- C 基础知识
- C基础知识
- C语言青葱之路-指针练习-输入整型数组,用指针输出
- CentOS安装Maven
- Java HashMap简介
- 有趣的汉语:同音文(一):《季姬击鸡记》
- 构建高可用ZooKeeper集群
- c++基础知识(4)
- Mysql常用命令详解
- c++8
- 整数排序
- 编辑神器 Emmet
- SPPNet:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
- 2017上海金马五校程序设计竞赛 B:Sailing
- Axure的使用---原型图
- Moving Averages(3): How To Use Them