Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 02.05.2018
Сообщений: 9
1

Ошибка с выделением памяти

02.05.2018, 22:09. Показов 384. Ответов 1
Метки нет (Все метки)

Помогите с прогой. Какая то ошибка с выделением памяти. В free_result пишет, что вызвано исключение. Подскажите в чем ошибка. Заранее благодарен

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h> 
#include <math.h> 
#include <conio.h> 
#include <stdlib.h> 
 
double** matr(int n, int m)// память
{
    double **arr = (double**)malloc(n * sizeof(double*));
    for (int i = 0; i < n; i++)
    {
        arr[i] = (double*)malloc(m * sizeof(double));
    }
    return arr;
}
 
void free_matr(double **arr, int n) //освобождение памяти
{
    for (int i = 0; i < n; i++)
    {
        free(arr[i]);
    }
    free(arr);
}
 
void input_matr(double** arr, int n, int m) // заполнение матрицы
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            arr[i][j] = 2 * i + 3 * j - 1;
        }
    }
}
 
void input_vektor(double *vekt, int m)// заполнение вектора
{
    for (int i = 0; i < m; i++)
    {
        vekt[i] = 5 * i + 2;
    }
}
 
double* vektor(int m)// память
{
    double* vekt = (double*)malloc(m * sizeof(double));
    return vekt;
}
 
void free_vektor(double *vekt)//освобождение памяти
{
    free(vekt);
}
 
double* result(int m)
{
    double* resul = (double*)malloc(m * sizeof(double));
    return resul;
}
 
void free_result(double *resul)//освобождение памяти
{
    free(resul);
}
 
double* new_vektor(double **arr, double *vekt, int n, int m)
{
    double *res = result(m);
    for (int k = 0; k < m; k++)
    {
        res[k] = 0;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            res[i] += arr[i][j] * vekt[j];
        }
    }
    return res;
}
 
void output_nov(double *nov, int n)
{
    printf("Result = \n");
    for (int i = 0; i < n; i++)
    {
        printf("\t");
        printf("%.1lf\n\n", nov[i]);
    }
}
 
void output_matr(double** arr, int n, int m)
{
    printf("Matrix = \n");
    for (int i = 0; i < n; i++)
    {
        printf("\t");
        for (int j = 0; j < m; j++)
        {
            printf("%.1lf\t", arr[i][j]);
        }
        printf("\t\n\n");
    }
    printf("\n");
}
 
void output_vektor(double *vekt, int m)
{
    printf("Vector = \n");
    for (int i = 0; i < m; i++)
    {
        printf("\t");
        printf("%.1lf\n\n", vekt[i]);
    }
}
 
 
int main()
{
    double** matro;
    double* vekto;
    int n, m;
    printf("Number of rows = ");
    scanf_s("%d", &n);
    printf("Number of columns = ");
    scanf_s("%d", &m);
    printf("\n");
    matro = matr(n, m);
    input_matr(matro, n, m);
    output_matr(matro, n, m);
    vekto = vektor(m);
    input_vektor(vekto, m);
    output_vektor(vekto, m);
    double *novo = new_vektor(matro, vekto, n, m);
    output_nov(novo, n);
    free_matr(matro, n);
    free_vektor(vekto);
    free_result(novo);
    _getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2018, 22:09
Ответы с готовыми решениями:

Задача с динамическим выделением памяти
Написать пользовательскую функцию на языке Си. Массивы А и В динамические, выделение памяти...

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

Ввод двумерного массива с динамическим выделением памяти
Ребят, пож-та, подскажите, что сделал не так. Для начала нужно просто ввести элементы матрицы...

Разобраться с динамическим выделением памяти в массиве строк
Здравствуйте. Помогите разобраться с динамическим выделением памяти в массиве строк. Нашел в сети...

1
424 / 272 / 159
Регистрация: 30.04.2017
Сообщений: 534
04.05.2018, 14:03 2
ddragonok, ошибка не в функции освобождения памяти
ошибка в строке 77 для res выделяется m элементов, а ты проходишь в цикле до n-ого элемента
Если n>m то будет выход за границы памяти, при этом программа будет обваливаться в конце
Пример
Для ввода 2 5 твоя программа работает - а для 5 2 не работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2018, 14:03

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Запись и чтение файла с выделением памяти на чистом C.
Помогите разобраться. Записываю вроде правильно. А прочитать не может. Выдает ошибку. Подскажите...

Не могу разобраться с выделением количества памяти - массив, указатель
Правильно ли я понимаю: когда мы используем массив, в примере ниже, то литерал копируется в массив,...

Считать строку любой длины с клавиатуры и переделать ее в массив с динамическим выделением памяти
Добрый день, Подскажите пожалуйста только недавно начали Си изучать и нам дали такое задание:...

Ошибка с перевыделением памяти
Задача состоит в том, чтобы посимвольно считать строку и записать её в динамический...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.