数组在for循环后丢失数据

时间:2019-03-20 08:16:47

标签: c++ arrays data-loss

我有以下代码:

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

可能是什么原因造成的?

1 个答案:

答案 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的某些元素位于相同的内存位置。