Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 25.01.2024
Сообщений: 10

free(): не освобождается память

02.08.2024, 00:19. Показов 717. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, почему не освобождается память. Интересует фрагмент кода с 26 до 34 строки.

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
#include <stdio.h>
#include <stdlib.h>
 
int *read_array(FILE *input, int *size);
void process_array(int size, int *array);
void print_array(FILE *output, int size, int *array);
 
int main(int argc, char **argv)
{
    int size;
    int *array;
    FILE *input;
    FILE *output;
 
    if (argc != 3) {
        fprintf(stderr, "Invalid arguments. Usage: %s input-file.txt\n", argv[0]);
        return 1;
    }
 
    input = fopen(argv[2], "r");
    if (!input) {
        fprintf(stderr, "Failed to open file\n");
        return 1;
    }
 
    array = read_array(input, &size);
    if (!array) {
        fprintf(stderr, "Input error");
 
        free(array);
        fclose(input);
        return 1;
    }
    fclose(input);
 
    process_array(size, array);
 
    output = fopen(argv[1], "w");
    if (!output) {
        fprintf(stderr, "Failed to open file\n");
        free(array);
        return 1;
    }
 
    print_array(output, size, array);
    fclose(output);
 
    free(array);
    return 0;
}
 
int *read_array(FILE *input, int *size)
{
    int result = fscanf(input, "%d", size);
    if (result != 1) {
        return NULL;
    }
 
    if (*size < 0) {
        return NULL;
    }
 
    int *array = malloc(*size * sizeof(int));
    for (int i = 0; i < *size; i++) {
        result = fscanf(input, "%d", &array[i]);
        if (result != 1) {
            return NULL;
        }
    }
    
    if (fscanf(input, "%d", &result) != EOF) {
        return NULL;
    }
 
    return array;
}
 
void process_array(int size, int *array)
{
    int tmp;
    for (int i = 0; i < (size + 1) / 2; i++) {
        for (int j = (size + 1) / 2 - 1 - i; j <  (size + 1) / 2 + i; j += 2) {
            tmp = array[j];
            array[j] = array[j + 1];
            array[j + 1] = tmp;
        }
    }
}
 
void print_array(FILE *output, int size, int *array)
{
    for (int i = 0; i < size; i++) {
        fprintf(output, "%d ", array[i]);
    }
    fprintf(output, "\n");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2024, 00:19
Ответы с готовыми решениями:

Не освобождается память от malloc
wchar_t* path; wchar_t* _path = L&quot;\dasdasdaev\dfg&quot;; if(!_path) return NULL; path = (wchar_t*)malloc(wcslen(_path) +...

Не освобождается память после Malloc
Всем привет! Столкнулся с проблемой. Я передаю в функцию путь и указатель на буфер, читаю содержимое файла, потом использую то, что...

Выделяется память для массива указателей нежелательно освобождается
Как вы видите, здесь выделяется память для массива указателей на &quot;строки&quot; analyzedTextArray, этот массив мне нужен для дальнейшей работы, а...

6
 Аватар для Pphantom
2431 / 1574 / 723
Регистрация: 17.03.2022
Сообщений: 5,099
02.08.2024, 02:24
А вы можете словами описать то условие, которое собирались проверять в строке 26?
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,122
02.08.2024, 03:02
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
int *read_array(FILE *input, int *size)
{
    int result = fscanf(input, "%d", size);
    if (result != 1) {
        return NULL;
    }
 
    if (*size < 0) {
        return NULL;
    }
 
    int *array = malloc(*size * sizeof(int));
if(!array) return array;
    for (int i = 0; i < *size; i++) {
        result = fscanf(input, "%d", &array[i]);
        if (result != 1) {
            return NULL;
        }
    }
    
    if (fscanf(input, "%d", &result) != EOF) {
        return NULL;
    }
 
    return array;
}
Если память не выделилась, куда ты будешь читать?
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
02.08.2024, 06:46
C
1
int *array = malloc(*size * sizeof(int));
size не инициализирован и содержит мусор
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,297
02.08.2024, 09:43
Цитата Сообщение от RaphisGunn Посмотреть сообщение
Подскажите, пожалуйста, почему не освобождается память. Интересует фрагмент кода с 26 до 34 строки.
Вы о чем вообще?

Во-первых, как вы вообще определили, освобождается память или нет? В чем это выражается?

Во-вторых, какую вы вообще собрались освобождать память в этих строчках? Указатель array там нулевой. Больше никакой памяти не видно. О чем речь вообще?

Память в случае ошибки ввода там уже поздно пытаться освобождать. У вас к ней уже нет доступа.
0
1482 / 496 / 73
Регистрация: 22.09.2023
Сообщений: 1,569
02.08.2024, 12:50
Цитата Сообщение от RaphisGunn Посмотреть сообщение
C
1
2
3
4
5
6
7
int *array = malloc(*size * sizeof(int));
    for (int i = 0; i < *size; i++) {
        result = fscanf(input, "%d", &array[i]);
        if (result != 1) {
            return NULL;
        }
    }
А кто будет тут освобождать память, выделенную в array?
0
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,326
02.08.2024, 21:16
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
#include <stdio.h>
#include <stdlib.h>
 
int * read_array  (FILE *, int *);
void  print_array (FILE *, int *, int);
 
int main (int argc, char **argv) {
    if (argc != 3) {
        fprintf(stderr, "Invalid arguments. Usage: %s output.txt input.txt\n", argv[0]);
        return 1;
    }
 
    FILE *input = fopen(argv[2], "r");
    if (input == NULL) {
        fprintf(stderr, "Failed to open file %s\n", argv[2]);
        return 1;
    }
 
    FILE *output = fopen(argv[1], "w");
    if (output == NULL) {
        fprintf(stderr, "Failed to open file %s\n", argv[1]);
        fclose(input);
        return 1;
    }
 
    int size;
    int *array = read_array(input, &size);
    if (array == NULL) {
        fprintf(stderr, "Input error");
        fclose(input);
        fclose(output);
        return 1;
    }
 
    // тут что-то делаем с массивом, сортируем и т.д.
 
    print_array(output, array, size);       // выводим массив в файл
    fclose(input);                          // закрываем файлы
    fclose(output);
    free(array);                            // освобождаем память
    return 0;
}
// -------------------------------------------------------------
int * read_array (FILE *fp, int *size) {
    if (fscanf(fp, "%d", size) != 1 || *size < 1)
        return NULL;
    int *temp = (int *) malloc(*size * sizeof(int));
    if (temp == NULL)
        return NULL;
    for (int i = 0; i < *size; i++)
        if (fscanf(fp, "%d", temp+i) != 1) {
            free(temp);
            return NULL;
        }
    return temp;
}
// -------------------------------------------------------------
void print_array (FILE *fp, int *a, int size) {
    for (int i = 0; i < size; i++)
        fprintf(fp, "% 4d", a[i]);
    fprintf(fp, "\n");
}
// -------------------------------------------------------------
или например, так:
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
#include <stdio.h>
#include <stdlib.h>
 
FILE *inp = NULL;
FILE *out = NULL;
int  *arr = NULL;
 
void quit (void);
int * read_array (FILE *, int *);
void print_array (FILE *, int *, int);
 
int main (int argc, char **argv) {
    if (argc != 3) {
        fprintf(stderr, "Invalid arguments. Usage: %s output.txt input.txt\n", argv[0]);
        return 1;
    }
 
    if (atexit(quit) != 0)
        return fprintf(stderr, "Error registering function quit()\n") < 0;
 
    inp = fopen(argv[2], "r");
    if (inp == NULL)
        return fprintf(stderr, "Failed to open file %s\n", argv[2]) < 0;
 
    out = fopen(argv[1], "w");
    if (out == NULL)
        return fprintf(stderr, "Failed to open file %s\n", argv[1]) < 0;
 
    int size;
    arr = read_array(inp, &size);
 
    // тут что-то делаем с массивом, сортируем и т.д.
 
    print_array(out, arr, size);
    return 0;
}
// -------------------------------------------------------------
void quit (void) {
    if (inp != NULL)
        fclose(inp);
    if (out != NULL)
        fclose(out);
    if (arr != NULL)
        free(arr);
}
// -------------------------------------------------------------
int * read_array (FILE *fp, int *size) {
    if (fscanf(fp, "%d", size) != 1 || *size < 1)
        exit(fprintf(stderr, "error file format\n") < 0);
    int *temp = (int *) malloc(*size * sizeof(int));
    if (temp == NULL)
        exit(fprintf(stderr, "error allocate memory\n") < 0);
    for (int i = 0; i < *size; i++)
        if (fscanf(fp, "%d", temp+i) != 1)
            exit(fprintf(stderr, "error file format\n") < 0);
    return temp;
}
// -------------------------------------------------------------
void print_array (FILE *fp, int *a, int size) {
    for (int i = 0; i < size; i++)
        fprintf(fp, "% 4d", a[i]);
    fprintf(fp, "\n");
}
// -------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2024, 21:16
Помогаю со студенческими работами здесь

Не могу освободить память с функцией free
int *get_vector(t_graph *begin, int **mat_adc, int n, int end) { int i; int j; int *v0; int ...

Память освобождается, только если программа работает при char *c, а нужно при char c
С клавиатуры вводится символьная строка (предложение), размещается в памяти, выводится в том же виде, память освобождается, работает при...

Как free освобождает память, выделенную через malloc?
Как функция free(void*) освобождает память выделенную malloc(). Если в malloc передавая размер malloc() знает сколько байт нужно...

Нужно, чтобы память под массив выделялась не через: new — delete, а через оператор malloc (calloc) — free
Ребят, есть программа, которая работает, но нужно, чтобы память под массив выделялась не через : new - delete, а через оператор...

Не освобождается память
Добрый всем день. Возможно, вопрос и глупый, но я на PHP недавно. Многочисленные упражнения с гуглом помогли лишь частично. В общем,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru