我有以下代码:
cin >> r >> c;
char map[c][r];
for(int i = 0; i < r; i++)
{
string line;
cin >> line;
for (int j = 0; j < c; ++j) {
map[j][i] = line[j];
}
}
int n;
cin >> n;
//cout << "first " << endl << map[0][0] << endl<< map[1][0] << endl<< map[2][0] << endl<< map[3][0] << endl;
pair<pair<int, int>, pair<int,int>> queries[n];
for (int k = 0; k < n; ++k) {
int r1, c1, r2, c2;
cin >> r1 >> c1 >> r2 >> c2;
queries[n] = make_pair(make_pair(r1-1, c1-1), make_pair(r2-1, c2-1));
}
cout << "test" << endl;
我遇到了一个非常奇怪的问题,在第二个for循环之后,我的地图数组似乎丢失了所有数据。我在“ int n;”行上有断点。和“ cout <<” test << endl;“
在第一个断点上,我的char数组充满了我期望的值,但是在第二个断点上,char数组中的所有值都是'\ 000'。
可能是什么原因造成的?
答案 0 :(得分:3)
问题一:
cin >> r >> c;
char map[c][r];
后来:
pair<pair<int, int>, pair<int,int>> queries[n];
这些是可变长度数组(VLA),它们是C而不是C ++的功能。 VLA不是C ++语言的一部分,尽管许多编译器都支持此扩展。相反,您可以使用std::vector<std::vector<char>>
来模拟行为。
问题二:
for(int i = 0; i < r; i++)
{
string line;
cin >> line;
for (int j = 0; j < c; ++j) {
map[j][i] = line[j];
}
}
这是未定义的行为,因为读取的字符串的长度可以小于c,但是代码访问c
元素而与line.length()
无关。应该是:
for(int i = 0; i < r; i++)
{
string line;
cin >> line;
for (int j = 0; j < c; ++j) {
map[j][i] = j < line.length() ? line[j] : '\0';
}
}
问题3:
另一种未定义的行为
pair<pair<int, int>, pair<int,int>> queries[n]; // better use std::vector
for (int k = 0; k < n; ++k) {
...
// Out of bounds queries[n]
queries[n] = make_pair(make_pair(r1-1, c1-1), make_pair(r2-1, c2-1));
最后一个可能会破坏您的map
数组。越界访问很可能与map
的某些元素位于相同的内存位置。