C++ 两种声明动态数组方式的区别

在使用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值