将一行空格分隔的整数读入数组,发现了mingw和msvc两种编译器定义动态数组的区别
初学动态数组很可能想当然的就定义成了下面这个亚子:
int n;
cin>>n;
int array[n];
结果发现在某些IDE下是可以使用的,但很奇怪的的是在VS上用不了这种写法
标准的定义应该写成这个亚子:
int n;
cin>>n;
int* array=new int[n];
原因来了,原因来了,原因来了:
这样定义动态(变长)数组C++ 标准不支持, GNU 方言支持,另外 C99 及之后版本的 C 标准也支持。
可以说第一种写法是方言版的,亲测在配置MinGW编译器的IDE上可用这种写法,MSVC编译器不支持。
这两种区别就在于:可以理解为这两个array一个是“对象”,一个是指针
下面用一个输入的例子来看两种区别:
输入为:
6
15 75 12 36 25 33
———————————————————————————————————————————————
第一种(方言版):
int main()
{
int n;
cin>>n;
cin.ignore(); //清理'\n'
int a[n];
int i = 0;
char c;
//将一行空格分隔开的整数,存到数组
while((c=getchar())!='\n')
{
if(c!=' ')
{
ungetc(c,stdin);
cin>>a[i++];
}
}
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
return 0;
}
结果为:
明显看到 sizeof(a) 的大小为整个数组的大小,第一个元素的大小为sizeof(a[0]),4×6=24,此时的int a[n] 的 a 理解为整个动态数组“对象"
——————————————————手动分割~—————————————————————————
第二种(c++标准):
int main()
{
int n;
cin>>n;
cin.ignore(); //清理'\n'
int *a=new int[n];
int i = 0;
char c;
//将一行空格分隔开的整数,存到数组
while((c=getchar())!='\n')
{
if(c!=' ')
{
ungetc(c,stdin);
cin>>a[i++];
}
}
cout<<sizeof(a)<<endl;
cout<<sizeof(a[0])<<endl;
for(int j=0;j<i;j++)
{
cout<<"a["<<j<<"]:"<<a[j]<<endl;
}
return 0;
}
结果为:
明显的看到 sizeof(a)=4=sizeof(a[0]),居然和数组内第一个元素大小相同,但数组总共有6个元素,大小理应为24,于是看到有 int* a=new int[n] 这一句就明白了,是int* a 让a指向了动态数组的首址,sizeof(a) 返回的就是首元素的大小。
个人感觉方言版有点像python,想啥写啥,是怎么回事。。。