C++ 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败)

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

我正在使用这个程序将输入的值存储在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::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;