【问题标题】:Initialize vector of pointers to pointers初始化指向指针的指针向量
【发布时间】:2018-11-08 12:18:37
【问题描述】:

我在初始化指向指针的指针向量时遇到了麻烦(无论如何我都不应该这样做,但请原谅我)。 我基本上有一个指针z 指向一个包含0 的变量,现在我想初始化一个包含指向该指针的指针的矩阵。

void example(int nrow, int ncol) {
    int zero = 0;
    int* z = &zero;
    int size = nrow * ncol;
    vector<int **> pointerMatrix(size);
    for (int i = 0; i < size; i++) {
        int** a = &z;       
        pointerMatrix.push_back(a);
    }
    //following line throws an exception:
    cout << **pointerMatrix[0] << endl;
}

现在上面的代码抛出了异常,显然指针指向的地址下什么都找不到了。

有人看到我的错误吗?

【问题讨论】:

  • pointerMatrix.size() 在循环之前已经是size。我打电话给 TYPO。
  • 为什么只在第一级使用向量,似乎你有一个额外的指针,它是一个 3 维张量 - 不会 vector > 解决你的问题而不诉诸原始指针放在首位?
  • @darune OP 是一个三星级程序员 8-)
  • @LogicStuff 如此真实

标签: c++ pointers vector


【解决方案1】:

documentation 中所述,pointerMatrix(size); 创建了一个具有 size 数量的默认初始化 (nullptr) 元素的向量,因此在循环之后,您的向量包含 2*size 元素,具有前半部分以nullptr 提交,后半部分作为实际元素提交,因此cout &lt;&lt; **pointerMatrix[0] &lt;&lt; endl; 试图取消引用nullptr

要解决此问题,您也可以致电 reserve,以避免不必要的重新分配:

vector<int **> pointerMatrix;
pointerMatrix.reserve (size);

或使用operator[] 分配值,而不是推送它们:

for (int i = 0; i < size; i++) {
    int** a = &z;       
    pointerMatrix[i] = a; // Or pointerMatrix[i] = &z;
}

【讨论】:

    【解决方案2】:

    push_back 用于在向量的末尾添加一个新元素。它有效地增加了向量的大小以在末尾添加元素。

    您已经指定了向量的大小,因此您可以使用operator[] 访问(和修改)元素,例如:

    for (int i = 0; i < size; i++) {
        pointerMatrix[i] = &z;
    }
    

    或者,使用基于范围的 for 循环:

    for (auto& entry : pointerMatrix) { // auto& can be replaced with int**&
        entry = &z;
    }
    

    【讨论】:

      【解决方案3】:

      您分配一个具有所需大小的数组,然后仍然使用push_back 在末尾添加更多元素。

      由于你打算用相同的元素填充整个数组,你应该使用这个:

      vector<int **> pointerMatrix(size, &z);
      

      【讨论】:

      • 最初的意图可能不是拥有指向同一地址的整个指针向量。
      【解决方案4】:
      vector<int **> pointerMatrix(size);
      

      应该是这样的

      vector<int **> pointerMatrix;
      

      您的实现中似乎存在拼写错误,因为指针矩阵在循环之前似乎已经是一个大小。您应该在索引中推送一个指针值或动态推送它。为此,我想,在不定义大小的情况下声明向量 pointerMatrix 应该可以。

      【讨论】:

      • 这只是要求重新分配。
      • 虽然这段代码可以解决眼前的问题,但最好包含一些上下文,解释它为什么起作用。从长远来看,纯代码答案没有用处。请edit你的答案并添加一些解释。
      • @Mika Prouk 询问他的代码中的任何错误。所以我认为只需指出我认为不合适的代码行就足够了。今后我会牢记这一点。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多