动态内存申请与释放
(1)malloc方式
申请一维内存时,格式为:
类型表示符 *变量名;
变量名 = (类型标识符*)malloc(sizeof(类型标识符)*数组大小);
在使用完该方式申请的内存后,必须用free()函数及时释放,格式为:
free(变量名)
变量名 = NULL;
当申请二维内存时,格式为:
类型标识符 **变量名;
变量名 = (类型标识符**)malloc(sizeof(类型标识符*)*数组行大小);
for(int i=0;i<数组行大小;i++)
变量名[i] = (类型标识符*)malloc(sizeof(类型标识符)*数组列大小);
释放格式:
free(变量名);
变量名 = NULL;
(2)new方式
当申请一维内存时,格式为:
类型标识符 *变量名;
变量名 = new 类型标识符[数组大小];
使用该方式申请的内存后,必须用delete()函数及时释放
格式:
delete[] 变量名;
变量名 = NULL;
当申请二维内存时,格式为:
类型标识符 **变量名;
变量名 = new 类型标识符*[数组行大小];
for(int i=0;i<数组行大小;i++)
变量名[i] = new 类型标识符[数组列大小];
释放格式:
delete[] 变量名;
变量名 = NULL;
例子:
申请二维内存
代码:
1 #include<iostream>
2 #include<malloc.h>
3 using namespace std;
4
5 int main()
6 {
7 int row;
8 int col = 2;
9 cout<<"please input row:"<<endl;
10 cin>>row;
11 int **memo;
12 memo = (int **)malloc(sizeof(int*)*row);
13 for(int k=0;k<row;k++)
14 memo[k] = (int *)malloc(sizeof(int)*col);
15 for(int i=0;i<row;i++)
16 {
17 for(int j=0;j<col;j++)
18 cin>>memo[i][j];
19 }
20 cout<<"标号——————————————值"<<endl;
21 for(int i=0;i<row;i++)
22 {
23 for(int j=0;j<col;j++)
24 cout<<memo[i][j]<<" ";
25 cout<<endl;
26 }
27 free(memo);
28 memo = NULL;
29 return 0;
30
31 }
注明:错误的释放指针会导致程序崩溃
但是什么时候会出现这种情况?怎么解决?
当指向内存块的指块已超出其边界,一定要将指针指回首地址。