C++;意外内存错误 p>我在易C++程序中发现了给定矩阵中最大的子矩阵: int *A = new int[n*m]; ... setting fields for matrix, finding the largest one and etc ... r := size of square-submatrix, max_i := row, max_j := column of the largest for (i = max_i; i < max_i + r; i++) { for (j = max_j; j < max_j + r; j++) cout << A[i * n + j] << "\t"; cout << "\n"; } <memory free> end of program int*A=新的int[n*m]; ... 设置矩阵的字段,查找最大的字段等 ... r:=方子矩阵的大小,max_i:=行,max_j:=最大子矩阵的列 对于(i=max_i;i

C++;意外内存错误 p>我在易C++程序中发现了给定矩阵中最大的子矩阵: int *A = new int[n*m]; ... setting fields for matrix, finding the largest one and etc ... r := size of square-submatrix, max_i := row, max_j := column of the largest for (i = max_i; i < max_i + r; i++) { for (j = max_j; j < max_j + r; j++) cout << A[i * n + j] << "\t"; cout << "\n"; } <memory free> end of program int*A=新的int[n*m]; ... 设置矩阵的字段,查找最大的字段等 ... r:=方子矩阵的大小,max_i:=行,max_j:=最大子矩阵的列 对于(i=max_i;i,c++,C++,至少可以通过我在评论中告诉您的方法(或通过使用调试器)来识别问题。最简单的方法是将动态数组更改为std::vector,然后在处使用成员函数。然后您将意识到在此处引发越界异常: for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { A.at(n*i + j) = rand() % 19 - 9; // throws here!!!!, replace n by m cout <&l

至少可以通过我在评论中告诉您的方法(或通过使用调试器)来识别问题。最简单的方法是将动态数组更改为
std::vector
,然后在处使用成员函数
。然后您将意识到在此处引发越界异常:

for (i = 0; i < n; i++)
{
    for (j = 0; j < m; j++)
    {
        A.at(n*i + j) = rand() % 19 - 9; // throws here!!!!, replace n by m
        cout << A.at(n*i + j) << "\t";
    }

    cout << "\n";
}
(i=0;i { 对于(j=0;j你能在矩阵存取码中倒i和j吗

基本上,公式可以是

current row + current column * number of rows

关于您的代码和调试的两个备注:

  • 使用单字母变量可以最大限度地减少键盘和手指的磨损,并减少磁盘和内存的使用。不过,这会显著增加调试时间

  • 仅仅因为代码没有立即崩溃就认为代码正常是绝对错误的。C/C++是未定义行为的领域(在您的情况下,可能是最常见的行为:在分配的内存之外编写)。UB是一项令人讨厌的工作,因为它可以产生任何结果,包括(经常)显然没有任何后果,只会导致一段完全正常的代码在10.000行之后崩溃


  • 你有没有可能写信给[-1]?我不这么认为。我已经发布了代码。谢谢!使用一些
    assert
    s来确保你没有执行任何越界访问,或者更好的是,使用
    std::vector
    和成员函数
    at()
    执行访问。通过这种方式,如果您尝试越界访问,将引发异常(如果您仅使用
    std::vector::operator[]
    )如果你使用这样的向量,可以很容易地测试正在发生的事情。作为一个一般的规则,你应该尝试避免在现代C++中使用原始指针。是的,我曾经做过这样的事情——但是我在帮助我的朋友,并且必须这样做(动态分配数组)。。除非我太累了,无法再阅读,否则你的乘数是错误的。它应该是
    I
    乘以一行的步幅。你是在乘以一列的高度。
    I*m+j
    应该是你的索引值。
    n
    应该只出现在那些循环中的一个位置:外层f中
    I
    的顶部谢谢你的时间和帮助。我似乎太累了,以至于不能分辨N和M BTW。用C++的老方法教C++是什么意思?是的,它是令人伤心的,但是一些导师甚至博士在C++方式下教C++,类(没有基本区分类和结构)。和新/删除-有时他们仍然使用MalCoS!毫无疑问,知道这样一个低级别的内存管理是好的,但我同意——我不能看到使用C++的那种东西。干杯!
    current row + current column * number of rows
    
    current row * number of columns + current column