初始化指向指针的向量

时间:2018-11-08 12:18:37

标签: c++ pointers vector

我在初始化指向指针的向量时遇到麻烦(我猜我不应该这样做,但是请原谅我)。 我基本上有一个指向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;
}

现在上面的代码引发了异常,显然在指针指向的地址下找不到任何内容。

有人看到我的错误吗?

4 个答案:

答案 0 :(得分:4)

documentation pointerMatrix(size);中所述,创建一个向量,其中包含size个默认初始化(nullptr)个元素,因此循环后,向量包含{ {1}}元素,前半部分作为2*size提交,后半部分作为实际元素提交,因此nullptr试图取消对cout << **pointerMatrix[0] << endl;的引用。

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

reserve

或者使用vector<int **> pointerMatrix; pointerMatrix.reserve (size); 来分配值,而不要推送它们:

operator[]

答案 1 :(得分:3)

for (int i = 0; i < size; i++) { int** a = &z; pointerMatrix[i] = a; // Or pointerMatrix[i] = &z; } 用于添加一个新元素,在向量的结尾。有效地增加了向量的大小,以在最后添加元素。

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

operator[]

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

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

答案 2 :(得分:1)

您分配了所需大小的数组,然后仍然使用push_back在末尾添加其他元素。

由于您打算用相同的元素填充整个数组,因此应使用以下代码:

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

答案 3 :(得分:-1)

vector<int **> pointerMatrix(size);

应该像

vector<int **> pointerMatrix;

似乎您的实现中有一个错字错误,因为指针矩阵似乎已经在循环之前确定了大小。您应该在索引中推送指针值或动态推送该值。为此,我认为在不定义大小的情况下声明矢量pointerMatrix应该有效。