Проблемы с выделением памяти в двумерном массиве (матрице) - PullRequest
1 голос
/ 21 ноября 2010

У меня есть несколько строк кода 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 ]

4 голосов
/ 21 ноября 2010

Если вы знаете, что матрица 3х3, почему все malloc с?Почему бы просто:

int matrix[3][3];

Это также обеспечивает автоматическое освобождение памяти.(Вы забыли позвонить free в своем коде!)

3 голосов
/ 21 ноября 2010

Ваш код почти правильный, но распределение матрицы неверное.Вы выделяете место для хранения одного 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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...