[Решено] Динамическая память и ошибка сегментирования.

Модератор: Модераторы разделов

Аватара пользователя
baldman88
Сообщения: 233

[Решено] Динамическая память и ошибка сегментирования.

Сообщение baldman88 »

Добрый день. Нужно решать уравнения методом Гауса. Для хранения матрицы и значений используется структура. Проблема в том, что при попытке инициализировать эту структуру получаю ошибку сегментирования. В общем вот :

Код: Выделить всё

typedef struct {
    float** matrix;
    float* values;
} Matrix;

void matrix_init(Matrix matrix, int size) {
    int row;
    int column;
    matrix.matrix = (float**) calloc(size, sizeof(float*));
    for (row = 0; row < size; row++)
        matrix.matrix[row] = (float*) calloc(size, sizeof(float));
    for (row = 0; row < size; row++)
        for (column = 0; column < size; column++) {
            printf("Enter element %i.%i >>> ", (row + 1), (column + 1));
            scanf("%f", &matrix.matrix[row][column]);
        }
    matrix.values = (float*) calloc(size, sizeof(float));
    for (row = 0; row < size; row++) {
        printf("Enter value %i >>> ", (row + 1));
        scanf("%f", &matrix.values[row]);
    }
}
...
int main() {
    Matrix matrix;
    int size;
    ...
    matrix_init(matrix, size);
    //здесь ошибка сегментирования
    ...
}

Объясните, пожалуйста, в чём ошибка? Предполагаю, что дело в областях видимости, но вроде же как указатели на кучу сами не удаляются? :unsure:
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5412
ОС: Gentoo

Re: [Решено] Динамическая память и ошибка сегментирования.

Сообщение /dev/random »

Я так полагаю, что сегфолтится он всё-таки чуть ниже, чем вы указали. Вы передаёте в функцию саму структуру, а не указатель на неё, а значит, в функции main() сруктура остаётся неинициализированной.
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: [Решено] Динамическая память и ошибка сегментирования.

Сообщение baldman88 »

Вот полный листинг файла с main :

Код: Выделить всё

#include <stdio.h>
#include "gauss.h"

int main() {
    int size;
    Matrix matrix;
    printf("Enter size >>> ");
    scanf("%i", &size);
    matrix_init(matrix, size);
    printf("Ok"); //это сообщение уже не выводится
    get_roots(matrix, size);
    matrix_remove(matrix, size);
    return 0;
}

Сейчас попробую через указатель.
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: [Решено] Динамическая память и ошибка сегментирования.

Сообщение baldman88 »

Большое спасибо. Через указатель работает.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5412
ОС: Gentoo

Re: [Решено] Динамическая память и ошибка сегментирования.

Сообщение /dev/random »

baldman88 писал(а):
04.10.2010 22:32
printf("Ok"); //это сообщение уже не выводится

Оно не выводится только потому, что текст на stdout выводится построчно. Здесь перевода строки нет, значит этот текст будет буферизован, а не выведен. Вообще-то эта строка у вас выполнялась успешно.
Спасибо сказали:
Аватара пользователя
baldman88
Сообщения: 233

Re: [Решено] Динамическая память и ошибка сегментирования.

Сообщение baldman88 »

Действительно. Поставил перевод строки и сообщение вывелось. Теперь буду знать. Ещё раз большое спасибо.
Спасибо сказали: