Ошибка сегмента при попытке заполнить матрицу, содержащуюся в структуре - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть структура для матрицы:

struct Matrice{

    int nblig;
    int nbcol;
    int **mat;

};

И моя программа имеет ошибку сегмента, когда я пытаюсь заполнить матрицу:

void initMat(Matrice *M)
{
    int j, i;
    srand(time(0));
    M->nbcol = (rand()%5)+1;
    M->nblig = (rand()%5)+1;
    for(i=0; i<M->nbcol;i++){
        for(j=0; j<M->nblig;j++){
           M->mat = rand()%101; //segfault here
        }
    }
}

Это было давноя не практиковал C, кто-нибудь понял, почему у меня есть этот segfault?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

Мне трудно поверить, что программа работает с ошибками именно в этой строке, но вполне вероятно, что она когда-нибудь выйдет из-за ошибки, если вы назначите случайное значение указателю.

Вы должны выделить память для матрицы, используя malloc; несколько раз, на самом деле, если вы используете структуру двойного указателя. При обработке матриц в C я склонен использовать другую структуру:

struct Matrix {
    size_t ncols, nrows;
    int *mat;
};

затем инициализируйте элемент mat с malloc(ncols * nrows) и индекс с mat[i * nrows + j]. Индексирование немного сложнее, но управление памятью намного проще, и некоторые матричные операции, вероятно, становятся намного быстрее, потому что все хранится в одном массиве .

1 голос
/ 27 сентября 2011

Похоже, вы пытаетесь присвоить номер мат. Есть две вещи, которые выглядят неправильно с этим: - Вам нужно выделить память на мат. Прямо сейчас у вас есть указатель, но по умолчанию он ни на что не указывает. - Вы назначаете циновку напрямую, рассматривая ее как одно целое число. Если предполагается, что это матрица, вы, вероятно, захотите индексировать на ее основе (например, M-> mat [i] [j]). Однако сначала выделите память.

1 голос
/ 27 сентября 2011

Вам необходимо инициализировать элемент mat в двумерный массив с соответствующим количеством строк и столбцов.

void initMat(Matrice *M)
{
    int j, i;
    srand(time(0));
    M->nbcol = (rand()%5)+1;
    M->nblig = (rand()%5)+1;

    M->mat = malloc(nbcol * sizeof(int));
    if (!M->mat)
    {
        /* memory allocation failed */
    }

    for(i=0; i<M->nbcol;i++){
        M->mat[i] = malloc(nblig * sizeof(int));
        if (!M->mat[i])
        {
            /* memory allocation failed */
        }

        for(j=0; j<M->nblig;j++){
           M->mat[i][j] = rand()%101;
        }
    }
}

Вам необходимо #include <stdlib.h>, чтобы иметь (без предупреждения) доступ к функции malloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...