【问题标题】:Two-dimensional array (matrix) memory allocation troubles二维数组(矩阵)内存分配的烦恼
【发布时间】:2024-05-04 02:45:02
【问题描述】:

我有几行 C++ 代码,其目的很简单 - 将矩阵存储在二维数组中,并且不会消耗比所需更多的内存。这意味着我必须在将矩阵中的每个数字放入矩阵之前为其分配内存。

#include <cstdlib>
#include <cstdio>

using namespace std;

int main() {
    int ** matrix;

    matrix = (int**)malloc(sizeof(int*));

    // Fill in the matrix
    matrix[0] = (int *) malloc(3 * sizeof(int));
    matrix[0][0] = 5;
    matrix[0][1] = 10;
    matrix[0][2] = 15;

    matrix[1] = (int *) malloc(3 * sizeof(int));
    matrix[1][0] = 2;
    matrix[1][1] = 4;
    matrix[1][2] = 6;

    int i, n;

    // Print the whole matrix
    for (n = 0; n < 3; n++) {
        for (i = 0; i < 3; i++) {
            printf("%i\t", matrix[n][i]);
        }
        printf("\n");
    }

    return 0;
}

当我编译上面的代码并运行它时,它在打印矩阵时崩溃:

3838 分段错误(核心转储) sh "${SHFILE}"

stackdump 如下所示:

Exception: STATUS_ACCESS_VIOLATION at eip=0040126A
eax=00000000 ebx=00B0021C ecx=00000000 edx=00000000 esi=6123DBAA edi=61179FC3
ebp=0028CD18 esp=0028CCF0 program=C:\workspace\c\PA1_9\dist\Debug\Cygwin_4.x-Windows\pa1_9.exe, pid 3828, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
0028CD18  0040126A  (6123DBAA, 61179FC3, 0028CD58, 61006CD3)
0028CD58  61006CD3  (00000000, 0028CD94, 61006570, 7EFDE000)
End of stack trace 

我猜指针/值会有一些麻烦...但我不知道在哪里以及为什么...

【问题讨论】:

  • 顺便说一句,程序中存在内存泄漏。
  • 没错!这只是糟糕的C++。 :P

标签: c++ arrays memory-management


【解决方案1】:

如果你知道矩阵是 3x3,为什么所有的 mallocs?为什么不简单:

int matrix[3][3];

它还负责自动释放内存。 (您忘记在代码中调用free!)

【讨论】:

  • 他没有“忘记”调用free()。程序终止于'return 0;' ...无需免费通话。
【解决方案2】:

您的代码几乎是正确的,但矩阵分配是错误的。当您尝试初始化两个元素(matrix[0]matrix[1])时,您正在分配空间来存储单个 int *

matrix = (int**)malloc(2 * sizeof(int *));

外部打印循环是错误的:矩阵中只有 2 行“行”(每行 3 列)。当您尝试访问matrix[2] 时程序会崩溃:

// Print the whole matrix
for (n = 0; n < 2; n++) {
    for (i = 0; i < 3; i++) {
        printf("%i\t", matrix[n][i]);
    }
    printf("\n");
}

【讨论】:

  • 2icecream:我愿意接受答案,但我可以在发布问题后 7 分钟内完成...所以请再等几分钟 :))
最近更新 更多