for循环后数组丢失数据

Array loses data after for loop

我有以下代码:

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'。

可能是什么原因造成的?

问题一:

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] : '[=13=]';
    }
}

问题 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.

的某些元素相同的内存位置