C++ 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败)
我正在使用这个程序将输入的值存储在nxn矩阵中 第一个输入是测试用例的数量。 第二个是n的值。所以我创建了一个n*n矩阵。 然后我输入每行的值Ex:。。。。 输入总是“.”或“#”的组合 以下是我正在使用的代码的一部分:C++ 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败),c++,string,vector,C++,String,Vector,我正在使用这个程序将输入的值存储在nxn矩阵中 第一个输入是测试用例的数量。 第二个是n的值。所以我创建了一个n*n矩阵。 然后我输入每行的值Ex:。。。。 输入总是“.”或“#”的组合 以下是我正在使用的代码的一部分: #define COL(val, R, C) (R*val)+C ? (R*val)+C:0 int main() { // Read the data int total_test = 0; int tmp, val = 0; std::str
#define COL(val, R, C) (R*val)+C ? (R*val)+C:0
int main() {
// Read the data
int total_test = 0;
int tmp, val = 0;
std::string tmp_s;
std::cin >> total_test;
// RUn it total_test number of time
for (; total_test; total_test--) {
std::cin >> val;
matrix path = matrix(val);
// Parse input
for (int row = val-1; row >= 0; row--) { //Corrected
std::cin >> tmp_s;
std::vector<char> chars(tmp_s.begin(), tmp_s.end());
for(int col = val-1; col >= 0; col--) {
if (chars[col] == '#')
path.row[row][COL(val, row, col)] = -1; // This is culprit! Thanks @The Dark
}
}
}
return 0;
}
谢谢!:) 我认为,问题在于您在这里访问数组超出了范围:
for (int row = val; row; row--)
这会破坏堆栈。
应该是:
for (int row = val-1; row>=0; row--)
另一件事是:您最好使用std::getline
而不是std::cin>>tmp\u s
并检查输入
最后,您不需要在矩阵中分配2个数组:
分配一个大小为
val*val
的函数,并添加一个at(int row,int col)
函数,该函数将偏移量计算为row*row\u size+col
。它将比2指针访问更快 tmp\u s
为空。总是。但是您可以使用它初始化chars
,然后访问chars
的元素,这些元素因此不存在 我认为您已经从您发布的代码中删除了出错的部分。
查看您以前的代码,您有一个带有行
元素的矩阵,该元素包含一个带有指向所有行的指针的数组,到目前为止还不错。您还有一个col
元素,它有一个指向所有数据的指针(可能应该称为data
)
但是,当您访问数据时,您使用的是以下代码:
path.row[row][COL(val, row, col)] = -1;
其中COL
为
#define COL(val, R, C) (R*val)+C ? (R*val)+C:0
“COL宏用于计算行R
和列C
在数据中的位置,但您的path.row
指针已经预先计算了行的位置。”。这意味着,对于除0以外的任何行,您将写入错误的位置,并且任何大于n/2的行都将写入超出数组末尾的位置,这可能会导致您看到的崩溃
要解决此问题,请使用已设置的数组访问,不要使用COL
宏(应将其从代码中删除):
谢谢你。我确实将数组更正为超出范围。但我还是犯了这个错误。我将尝试改用getline。那没有帮助。也尝试了getline。在那一点上仍然失败。堆栈在哪里损坏?显示为更改,并在读取行后检查cols变量值和tmp_s大小。它并不总是空的。我通过cin@nightfury:不,你没有。你的问题中没有这样的代码。使用更新:我在线使用并编译了它。代码只编译并运行文件!我的设置有什么问题?我将GCC4.9.2用于目标x86_64-linux-gnu。在笔记本电脑上安装linux会容易得多。在C++中通过网站编译学习程序是很奇怪的。@ BaselestalyKyvyt:哈哈哈…这是真的。我确实使用linux ubuntu。我只是想试试它是否可以在其他设置上编译。它看起来可以在网站上的任何cpp编译器和设置上运行。请阅读(并害怕)。你的节目有一些。谢谢。这就是问题所在。我现在想知道,当我使用(4个字符的倍数)作为输入时,错误才会出现的原因是什么。我明白这是因为编译器分配内存的方式。但具体如何?有可能知道这一点吗?内存布局取决于您的编译器,所以当您超出数组边界时会发生什么是“未定义行为”。在这种情况下,
cin
或tmp\u
可能在col
数据所在的位置附近分配了内存。当您使用4的倍数时,可能溢出刚好达到了某个临界值,否则它会覆盖一些不太重要的内存部分(例如,在字符串缓冲区内,您已经读取过的字符串)。这要归功于运气。正如评论中所说,使用valgrind可能会帮助您更可靠地找到这一点。
#define COL(val, R, C) (R*val)+C ? (R*val)+C:0
path.row[row][col] = -1;