引用更改大小的向量时出现分段错误
Segmentation Fault when refrencing vectors that changed size
所以我在主函数中初始化了一个向量,然后将该向量作为引用传递给一个大小发生变化的函数。现在,我可以想象 main 中的初始化向量的大小会发生变化,但事实并非如此。我只是错误地实施了这个吗?
#include <iostream>
#include <vector>
using std::vector;
void createImage(vector<vector<char> >& img){
int cols, rows;
std::cin >> rows >> cols;
img.clear();
for(int i = 0; i < rows; i++)
img.push_back(vector<char>(cols, 'O'));
}
void colorPixel(vector<vector<char> > &img){
int xCoord, yCoord;
char color;
std::cin >> xCoord >> yCoord >> color;
img[xCoord][yCoord] = color;
}
void printVector(vector<vector<char> > &img){
for(int i = 0; i < img.size(); i++){
for(int j = 0; j < img[i].size(); j++)
std::cout << img[i][j];
std::cout << '\n';
}
}
int main(){
char operation;
while(std::cin >> operation){
vector<vector<char> > myVector;
if(operation == 'X')
break;
if(operation == 'I')
createImage(myVector);
if(operation == 'C')
printVector(myVector);
if(operation == 'L')
colorPixel(myVector);
}
}
编辑:
这就是正在发生的事情。当您创建矢量时,调用 createImage() 的 I 5 5 有效,但是当您在 myVector[4][4].
调用 colorPixel() 的 L 4 4 P 时,它开始失败
如果我将 main 中的 myVector 初始化为 250 250,那么 print 将打印所有 250 行,即使在 createImage() 中更改大小(例如 4 4)之后也是如此。
简而言之,我相信并且确定知道 main 中的向量没有得到其大小已更改的提示,是否有任何解决方法?
while(std::cin >> operation){
vector<vector<char> > myVector;
在此 while
循环中发生的第一件事是创建了一个新的 myVector
。从字面上看,这就是 C++ 中的意思。
当到达循环末尾时,这个 myVector
被销毁。这就是 C++ 的工作原理:如果您在循环中或在 if
语句中声明一个对象,则当执行到达此范围的末尾时该对象将被销毁。
因此,当此 while
循环到达此终点时,此 myVector
将被销毁。它不再存在。它会消失的。它会容易存在。它将渴望峡湾。它将变成 ex-myVector.
然后,再次检查 while
循环的条件,如果条件仍然成立,则执行再次进入 while
,从头开始创建一个新的 myVector
。它与之前的 myVector 没有任何关系,这只是一个模糊的记忆。
解决这个问题的方法是在这个循环之前声明这个myVector
这个循环,在你的main
,所以这个 myVector
只有在 main
本身完成执行时才会被销毁。
所以我在主函数中初始化了一个向量,然后将该向量作为引用传递给一个大小发生变化的函数。现在,我可以想象 main 中的初始化向量的大小会发生变化,但事实并非如此。我只是错误地实施了这个吗?
#include <iostream>
#include <vector>
using std::vector;
void createImage(vector<vector<char> >& img){
int cols, rows;
std::cin >> rows >> cols;
img.clear();
for(int i = 0; i < rows; i++)
img.push_back(vector<char>(cols, 'O'));
}
void colorPixel(vector<vector<char> > &img){
int xCoord, yCoord;
char color;
std::cin >> xCoord >> yCoord >> color;
img[xCoord][yCoord] = color;
}
void printVector(vector<vector<char> > &img){
for(int i = 0; i < img.size(); i++){
for(int j = 0; j < img[i].size(); j++)
std::cout << img[i][j];
std::cout << '\n';
}
}
int main(){
char operation;
while(std::cin >> operation){
vector<vector<char> > myVector;
if(operation == 'X')
break;
if(operation == 'I')
createImage(myVector);
if(operation == 'C')
printVector(myVector);
if(operation == 'L')
colorPixel(myVector);
}
}
编辑: 这就是正在发生的事情。当您创建矢量时,调用 createImage() 的 I 5 5 有效,但是当您在 myVector[4][4].
调用 colorPixel() 的 L 4 4 P 时,它开始失败如果我将 main 中的 myVector 初始化为 250 250,那么 print 将打印所有 250 行,即使在 createImage() 中更改大小(例如 4 4)之后也是如此。
简而言之,我相信并且确定知道 main 中的向量没有得到其大小已更改的提示,是否有任何解决方法?
while(std::cin >> operation){
vector<vector<char> > myVector;
在此 while
循环中发生的第一件事是创建了一个新的 myVector
。从字面上看,这就是 C++ 中的意思。
当到达循环末尾时,这个 myVector
被销毁。这就是 C++ 的工作原理:如果您在循环中或在 if
语句中声明一个对象,则当执行到达此范围的末尾时该对象将被销毁。
因此,当此 while
循环到达此终点时,此 myVector
将被销毁。它不再存在。它会消失的。它会容易存在。它将渴望峡湾。它将变成 ex-myVector.
然后,再次检查 while
循环的条件,如果条件仍然成立,则执行再次进入 while
,从头开始创建一个新的 myVector
。它与之前的 myVector 没有任何关系,这只是一个模糊的记忆。
解决这个问题的方法是在这个循环之前声明这个myVector
这个循环,在你的main
,所以这个 myVector
只有在 main
本身完成执行时才会被销毁。