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-玉盘如果有帮助的话,也许你应该接受这个答案。