-
栈:在函数内部声明的所有变量都将占用栈内存。【局部变量存入栈】
-
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。【程序运行分配堆】
先 总结:
1. malloc和free是函数,new和delete是操作符
2. malloc的返回值为void*, 在使用时必须强转,new不需要,因为后面跟的有指针指向的类型。
3.new后面跟指针指向的数据类型,delete后跟这个指针。
简单的使用:
#include <iostream> //使用std命名空间需要这个
#include <cstdlib> //#include <stdlib.h>
#include <cstring> //#include <string.h>
using namespace std;
int main(){
/**** c语言中 malloc、free ****/
#if 0
char *p1 = (char *)malloc(15);
strcpy(p1, "hello world!");
puts(p1); //最后有自动换行
free(p1);
#endif
//申请多个对象 连续堆空间. 【一维数组】
char *p2 = new char[15];
strcpy(p2, "hello world!");
puts(p2);
delete []p2; //释放多个对象 连续堆空间
//申请单个对象 堆空间 【单个变量】
int *a = new int; //int *a = (int *)malloc(sizeof(int)); c语言需要这样写
*a = 123;
cout << a << " -> " << *a << endl;
delete a; //释放单个对象 堆空间
/*** 二维数组arr1[5][3] 申请堆空间 ******/
int i=0,j=0;
int **arr1 = new int* [5]; //new后面是该指针指向的类型。即二级指针指向的是一级指针。
for(i=0;i<5;i++){
arr1[i] = new int [3];
}
//赋值
for(i=0; i<5; i++){
for(j=0;j<3;j++){
arr1[i][j]=i*10+j;
}
}
//打印
for(i=0;i<5;i++){
for(j=0;j<3;j++)
cout<<arr1[i][j]<<" ";
cout<<endl;
}
//释放 二维数组arr1[5][3] 堆空间
for(i=0; i<5; i++){
delete [] arr1[i];
}
delete [] arr1;
return 0;
}
运行结果: