在使用new申请动态数组时通常有两种做法:
int *p0;
p0 = new int[2];
int *p0 = new int[2];
一般来说,二者是等价的,但有时会出现一些意想不到的bug,举例:
#include<iostream>
using namespace std;
int main(void)
{
int Len;
int *p0 = new int[Len];
cout << "Input Len: ";
cin >> Len;
for(int i = 0 ; i < Len ; i++)
p0[i] = i;
for(int i = 0 ; i < Len ; i++)
cout << "p0#" << i << ": " << p0[i] << endl;
return 0;
}
该程序希望申请一个长度为Len的数组p0,Len的长度在之后手动输入,然后往数组中填充数据,最后显示。
在dev c++中该程序没有问题,但在VS2019中会报错说 Len未指定,推测是因为使用不同的编译器的原因。也就是说在VS2019中,创建动态数组时,虽然允许长度为变量,但在该语句之前变量的值必须要确定!(而在某些时候表示长度的变量值在用户输入前具备默认值,则编译器会通过创建动态数组的语句,最后造成在运行时出错还很难找到原因,非常头疼。)
因此推荐使用以下两种方式声明动态数组:
#include<iostream>
using namespace std;
int main(void)
{
int Len;
int *p0;//先创建指针
cout << "Input Len: ";
cin >> Len;
p0 = new int[Len];//再分配内存。在分配前Len确定了。
for(int i = 0 ; i < Len ; i++)
p0[i] = i;
for(int i = 0 ; i < Len ; i++)
cout << "p0#" << i << ": " << p0[i] << endl;
delete[] p0;
return 0;
}
#include<iostream>
using namespace std;
int main(void)
{
int Len;
cout << "Input Len: ";
cin >> Len;
int *p0 = new int[Len];//在Len确定后再申请内存,并用指针指向它。
for(int i = 0 ; i < Len ; i++)
p0[i] = i;
for(int i = 0 ; i < Len ; i++)
cout << "p0#" << i << ": " << p0[i] << endl;
delete[] p0;
return 0;
}