初始化指向指针的指针向量

Posted

技术标签:

【中文标题】初始化指向指针的指针向量【英文标题】: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 如此真实 【参考方案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 询问他的代码中的任何错误。所以我认为只需指出我认为不合适的代码行就足够了。今后我会牢记这一点。谢谢。

以上是关于初始化指向指针的指针向量的主要内容,如果未能解决你的问题,请参考以下文章

使用 unordered_map 值初始化指向向量的指针时出错

在创建指向 Mat 向量的指针时,表达式列表在初始化程序中被视为复合表达式

向量的指针向量

用向量 c++ 中的指针成员初始化对象

C ++如何使用指向向量指针的指针

添加指向数组的指针时出现分段错误