我在初始化指向指针的向量时遇到麻烦(我猜我不应该这样做,但是请原谅我)。
我基本上有一个指向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;
}
现在上面的代码引发了异常,显然在指针指向的地址下找不到任何内容。
有人看到我的错误吗?
答案 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应该有效。