代码之家  ›  专栏  ›  技术社区  ›  Radek Simko

二维数组(矩阵)内存分配问题

  •  1
  • Radek Simko  · 技术社区  · 14 年前

    我有几行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 
    

    我想指针/值会有一些问题。。。但我不知道为什么。。。

    2 回复  |  直到 9 年前
        1
  •  3
  •   icecrime    14 年前

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

    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");
    }
    
        2
  •  4
  •   fredoverflow    14 年前

    如果你知道矩阵是3x3,为什么 malloc s?为什么不干脆:

    int matrix[3][3];
    

    这也会自动释放内存。(你忘了打电话 free 在你的代码中!)