初始化指向指针的指针向量
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如documentation 中所述,pointerMatrix(size);
创建了一个具有 size
数量的默认初始化 (nullptr
) 元素的向量,因此在循环之后,您的向量包含 2*size
元素,具有前半部分以nullptr
提交,后半部分作为实际元素提交,因此cout << **pointerMatrix[0] << 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 值初始化指向向量的指针时出错