在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<size;i++) { int n = *p_tmp; printf("%d ",n); p_tmp++; } cout<<endl; for(int i = 0;i<size;i++) { int n = *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"); return 0; }
结果:
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*类型的,使用时一般需要强转。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。