【问题标题】:c++ the best way of creating and initializing arrayc++ 创建和初始化数组的最佳方式
【发布时间】:2015-08-17 14:04:46
【问题描述】:

创建和初始化数组的更好(更有效)方法是什么?

1. int array[3] {1,2,3};

2. int *array=new int[3]{1,2,3};

【问题讨论】:

  • 一个不是数组,一个是
  • 最好使用std::vectorstd::array。原始数组很难正确使用。
  • @AlanStokes,请回答。当初学者询问 C 数组时,我们都需要鼓励更多使用vector

标签: c++ arrays memory


【解决方案1】:

不要以为“更好”总是意味着更高效!在一个函数体中,这两个做的事情非常不同:

int array[3] {1,2,3};

第一个分配本地存储(在堆栈上),将在函数终止时释放。 (因此您不应尝试在该生命周期之后使用它)。

int *array = new int[3] {1,2,3};

第二个分配新的堆内存,函数终止时不会释放。 (所以你应该记得在不再需要它时delete[]它)

【讨论】:

    【解决方案2】:

    最好的办法是:

     int array[3] = {1,2,3}; // assignment operator added
    

    在您的示例中,只有第一个是数组:

     int array[3];
    

    第二个是一个指针,分配有操作符new返回的地址。要查看两者的区别,请尝试sizeof(array)

    int array[3];
    cout << sizeof(array) << endl;
    

    我的编译器显示 12(即 3 * sizeof(int),数组的大小取决于元素的数量),但是

    int *array=new int[3];
    cout << sizeof(array) << end
    

    对于我的编译器显示 4(即 sizeof(int*),指针大小仅取决于平台)

    【讨论】:

      【解决方案3】:

      让我们从第二个开始。 int *array = new int[3] {1,2,3};

      它创建一个动态数组。'动态'意味着内存将在运行时分配,而不是在编译时分配。所以你上面的初始化将创建一个大小为 3 的数组,它将用给定的值初始化。请记住,动态分配的内存没有预定义的范围,因此需要使用“删除”运算符释放内存。使用指针时也要小心,因为如果使用不当,它们可能会对您的程序造成严重破坏!

      现在是第一个。 int array[3] = {1,2,3};

      它创建一个大小为 3 的数组并用给定的值对其进行初始化。在此内存是静态分配的(在编译期间)。只要程序继续,变量就会留在内存中,然后消失! 因此,您可以根据需要决定数组初始化的类型。

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        • 2011-08-23
        • 2018-03-09
        • 2011-11-24
        相关资源
        最近更新 更多