C++ 不同方式的动态数组声明
我知道C++ 不同方式的动态数组声明,c++,arrays,heap,C++,Arrays,Heap,我知道int*array=newint[n]在堆中分配内存空间 但是如果我声明这样的东西:intarray[n]在codeblocks中编译成功,但如果我将其移动到visual studio,它就会出错 我想问的是: int[n]真正做什么?它与堆分配相比如何?他们之间有什么区别 如果我使用int-array[n]而不是int*array=new int[n],可能会出现什么错误 GCC在C++中有一个扩展,允许代码> int数组[n] < /C> >代码< n>代码>不是编译时常量值。在这种
int*array=newint[n]代码>在堆中分配内存空间
但是如果我声明这样的东西:intarray[n]
在codeblocks中编译成功,但如果我将其移动到visual studio,它就会出错
我想问的是:
int[n]
真正做什么?它与堆分配相比如何?他们之间有什么区别
如果我使用int-array[n]
而不是int*array=new int[n],可能会出现什么错误代码>
<> GCC在C++中有一个扩展,允许代码> int数组[n] < /C> >代码< n>代码>不是编译时常量值。在这种情况下,标准语言不允许对n
使用非常量值(在C99中允许)> PGC在C++中有一个扩展,允许代码> int数组[n] < /C> >代码> n>代码>不是编译时常量值。在这种情况下,标准语言不允许对n
使用非常量值(在C99中允许) int-array[n]
在堆栈而不是堆上声明数组。在标准C++中,代码> N< /代码>必须是编译时常数,但是有些编译器有一个扩展,允许在没有编译时间常数<代码> n>代码>的情况下声明该形式的可变长度数组。它不是标准的,可能不应该使用
int-array[n]
可能会在int*array=new int[n]上引起一些问题代码>:
- 如果
n
足够大,则可能导致堆栈溢出。或者,如果数组是类成员,并且您创建了该类的大型数组
- 如果
array
是类成员,则移动可能与复制一样昂贵
- 如果
array
是类成员,并且您已发出指向该数组和move
该类的指针,则指针现在指向移动后的对象,或者如果该对象也被销毁,则指向随机内存。不管怎样,都很糟糕
int-array[n]
在堆栈而不是堆上声明数组。在标准C++中,代码> N< /代码>必须是编译时常数,但是有些编译器有一个扩展,允许在没有编译时间常数<代码> n>代码>的情况下声明该形式的可变长度数组。它不是标准的,可能不应该使用
int-array[n]
可能会在int*array=new int[n]上引起一些问题代码>:
- 如果
n
足够大,则可能导致堆栈溢出。或者,如果数组是类成员,并且您创建了该类的大型数组
- 如果
array
是类成员,则移动可能与复制一样昂贵
- 如果
array
是类成员,并且您已发出指向该数组和move
该类的指针,则指针现在指向移动后的对象,或者如果该对象也被销毁,则指向随机内存。不管怎样,都很糟糕
如果我正确理解了您的问题,那么我可以同时回答这两个问题
int-array[10]
在堆栈上分配,而int*array=new int[10]
在堆上分配。通常,堆栈数组只能与常量元素一起工作,因此C90中不允许使用int-array[n]
(只要n
不是常量)
- MinGW(codeblocks在windows上使用的GCC编译器版本)有一个扩展,允许您在C90模式下编写
int-array[n]
,其中n
不是常量。Visual C++不允许这样做。
如果我正确理解你的问题,那么我可以回答这两个问题
int-array[10]
在堆栈上分配,而int*array=new int[10]
在堆上分配。通常,堆栈数组只能与常量元素一起工作,因此C90中不允许使用int-array[n]
(只要n
不是常量)
- MinGW(codeblocks在windows上使用的GCC编译器版本)有一个扩展,允许您在C90模式下编写
int-array[n]
,其中n
不是常量。Visual C++不允许这样做。
当您编写
int-array[n]
时,这意味着您正在执行静态分配。i、 e.内存将在编译时分配。因此,在这里使用可变长度将导致编译时错误。当您编写int-array[n]
时,这意味着您正在执行静态分配。i、 e.内存将在编译时分配。因此,在这里使用可变长度将导致编译时错误。可变长度不应用于静态大小的数组。CODBOLKET接受它是因为GCC可能对它有支持作为扩展。从GCC文档中获取:<代码>允许在ISOC99中允许可变长度自动数组,并且作为扩展GCC接受C90模式和C++中的代码。< /代码>不可变长度不应该用于静态大小的数组。CODBOLKET接受它是因为GCC可能对它有支持作为扩展。从GCC文档中获取:<代码>允许在ISOC99中允许可变长度自动数组,并且作为扩展GCC接受C90模式和C++中的代码。< /代码>当使用<代码> int数组[n]时,是否存在潜在的问题?
?那么为什么有些编译器会对其进行扩展?Thx@Liang-YuPan@Liang YuPan,因为它在C99标准中(C++在C标准中有很多共享),而且很方便。但它不是在C++中standard@Liang-玉盘如果答案有帮助的话,也许你应该接受。那么,当我使用int-array[n]
时,是否会出现任何潜在的问题?那么为什么有些编译器会为它做扩展呢?Thx@Liang-YuPan@Liang YuPan,因为它在C99标准中(C++在C标准中有很多共享),而且很方便。但它不是在C++中standard@Liang-玉盘如果有帮助的话,也许你应该接受这个答案。