【问题标题】:Array loses data after for loop数组在for循环后丢失数据
【发布时间】:2019-03-20 08:16:46
【问题描述】:

我有以下代码:

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

在第一个断点上,我的 char 数组填充了我期望的值,但是在第二个断点上,char 数组中的所有值都是 '\000'。

这可能是什么原因造成的?

【问题讨论】:

  • 不知道,但你意识到char map[c][r]; 不是合法的C++?在 C++ 中,数组边界必须是编译时常量。尝试改用向量。 ... queries[n]; 出于同样的原因是非法的。
  • 你显然在做using namespace std;,但你也使用map作为变量名。当std::map 进入游戏时,这就是等待发生的“有趣的事情”。无论如何,如果你能把它变成minimal reproducible example(阅读:我们可以把它扔进godbolt.orgwandbox.org或类似的东西并编译)我们可能会进一步帮助你。
  • 另外,line[j] 上没有检查越界访问,但这些都不能解释你看到的问题。
  • 应该是queries[k] 而不是queries[n]? (我无法真正说出你想要做什么,所以我不能说这是错误的)。

标签: c++ arrays data-loss


【解决方案1】:

问题一:

cin >> r >> c;
char map[c][r];

后来:

pair<pair<int, int>, pair<int,int>> queries[n];

这些是可变长度数组 (VLA),它是 C 而不是 C++ 的一个特性。 VLA 不是 C++ 语言的一部分,尽管许多编译器支持此扩展。相反,您可以使用std::vector&lt;std::vector&lt;char&gt;&gt; 来模拟该行为。

问题二:

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

【讨论】:

  • 不敢相信我错过了。
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多