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
.
的某些元素相同的内存位置
我有以下代码:
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
.