Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Mr Stormer
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 10
1

Сделать проверку, выделил ли malloc память

27.06.2018, 19:03. Просмотров 747. Ответов 4
Метки нет (Все метки)

Добрый день!
Нужна помощь по коду: в строках (34, 45 и 48), где я использовал malloc нужно тут же сделать проверку - выделил ли malloc память ли нет.
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
#include <stdio.h>      // Стандартная библиотека
#include <windows.h>    // Подключаем для украинского языка
#include <string.h>     // Нужна для функции strcmp() - сравнение двух слов
 
#define SIZE 2          /* Количество вводимых товаров */
typedef struct {        /* Объявляем структуру и создаем сразу псевдоним типа данных. То-есть создаем тип данных Product */
    char * name;        /* Объявляем название продукта */
    char * specification; /* Объявляем тип характеристики */
    union {                 /* Объявляем объединение. Объединение позволяет хранить разные типы данных в одном и том же месте памяти. */
        char * color;                       /* Будет выбран или цвет */
        unsigned int clockRate;             /*              или тактовая частота */
        unsigned int numberOfPrograms;      /*              или количество програм */
    };
    unsigned short int check;               /* Будет показывать нужно ли очищение памяти с переменной (prod + i)->color после использование malloc */
} Product;
 
void inputData(Product *);      /* Объявляем прототип функции ввода данных */
void outputData(Product *);     /* Объявляем прототип функции вывода данных */
 
int main(void)
{
    SetConsoleCP(1251);         /* Объявляем использование украинского языка */
    SetConsoleOutputCP(1251);
    Product prod[SIZE];         /* Объявляем массив структур с количеством SIZE */
    inputData(prod);            /* Передаем массив структур в функцию для ввода данных */
    outputData(prod);           /* Передаем массив структур в функцию для вывода данных */
    return 0;
}
 
void inputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)  /* Цикл, который нужен для выделения динамической памяти под Название товара и Тип характеристики */
    {
        (prod + i)->name = (char *)malloc(sizeof(char) * 10);
        (prod + i)->specification = (char *)malloc(sizeof(char) * 10);
    }
 
    for (int i = 0; i < SIZE; i++)
    {
        printf("Введіть назву товару: ");
        scanf("%s", (prod + i)->name);
        printf("Введіть тип характеристики (колір, тактова/частота, програми):\n");
        while (scanf("%s", (prod + i)->specification))  /* Если ввод не правильный, то оно опять вернется к вводу */
        {
            if (strcmp((prod + i)->specification, "колір") == 0) /* Сравниваем то, что ввел пользователь в тип характеристики со словом */
            {
                printf("Введіть колір: ");
                (prod + i)->color = (char *)malloc(sizeof(char) * 10); /* Выделяем динамическую память для цвета */
                scanf("%s", (prod + i)->color);
                (prod + i)->check = 1;  /* Устанавливаем переменную check в 1. Это будет означать, что в следующей функции нужно очистить память */
                break;
            }
            else if (strcmp((prod + i)->specification, "тактова") == 0 || strcmp((prod + i)->specification, "частота") == 0) /* Сравниваем то, что ввел пользователь в тип характеристики с словами */
            {
                printf("Введіть тактову частоту: ");
                scanf("%u", &(prod + i)->clockRate);
                break;
            }
            else if (strcmp((prod + i)->specification, "програми") == 0) /* Сравниваем то, что ввел пользователь в тип характеристики со словом */
            {
                printf("Введіть кількість програм: ");
                scanf("%u", &(prod + i)->numberOfPrograms);
                break;
            }
            else
                printf("Перевірте правильність вводу: ");
        }
    }
}
 
void outputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)
    {
        printf("\n\nНазва %d-го товару: %s\n", i + 1, (prod + i)->name);
        if (strcmp((prod + i)->specification, "колір") == 0)
            printf("Колір: %s", (prod + i)->color);
        else if (strcmp((prod + i)->specification, "тактова") == 0 || strcmp((prod + i)->specification, "частота") == 0)
            printf("Тактова частота: %u", (prod + i)->clockRate);
        else
            printf("Кількість програм: %u", (prod + i)->numberOfPrograms);
    }
 
    for (int i = 0; i < SIZE; i++)      /* Цикл для очищения памяти после динамически выделенной памяти */
    {
        free((prod + i)->name);
        free((prod + i)->specification);
        if ((prod + i)->check == 1)
            free((prod + i)->color);
    }
}
P.s. комментарии делал для себя
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2018, 19:03
Ответы с готовыми решениями:

Определить, сколько памяти выделил malloc под массив
Подскажите, пожалуйста, можно ли узнать, сколько памяти выделено под массив, на...

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

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

Как корректно очистить память, которая была выделена с помощью malloc?
Добрый день. Как корректно очистить память, которая была выделена с помощью...

Зачем выделять память с помощью malloc, а также с помощью new?
Поясните пож. компилятор мингв. Работаю с массивом и ни как не могу понять как...

4
ValeryS
Модератор
7444 / 5636 / 716
Регистрация: 14.02.2011
Сообщений: 19,192
Завершенные тесты: 1
27.06.2018, 19:24 2
Лучший ответ Сообщение было отмечено Mr Stormer как решение

Решение

Цитата Сообщение от Mr Stormer Посмотреть сообщение
в строках (34, 45 и 48),
вот если бы в теги код взял, то мы бы увидели номера строк
Цитата Сообщение от Mr Stormer Посмотреть сообщение
C++
1
(prod + i)->name = (char *)malloc(sizeof(char) * 10);
ну так проверь на 0(NULL)
1
D3m1an
149 / 121 / 57
Регистрация: 11.08.2016
Сообщений: 416
Завершенные тесты: 1
27.06.2018, 22:02 3
Лучший ответ Сообщение было отмечено Mr Stormer как решение

Решение

C
37
38
39
40
if((prod + i)->specification == NULL || (prod + i)->name == NULL)
{
    //Обработка ошибок
}
Так чтоль ... Странно, что у Вас возник такой вопрос, если Вы написали такого рода программу .
1
Mr Stormer
0 / 0 / 0
Регистрация: 08.10.2017
Сообщений: 10
27.06.2018, 22:14  [ТС] 4
туплю, можно сказать, на самом простом
спасибо)
0
D3m1an
27.06.2018, 22:16     Сделать проверку, выделил ли malloc память
  #5

Не по теме:

Mr Stormer, так оно обычно и бывает :good:

0
27.06.2018, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2018, 22:16
Привет! Вот еще темы с ответами:

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

В чем разница между malloc() и (char *)malloc()
Прошу помочь разобраться: не могу понять в чем разница...

Сделать проверку, чтобы программа не крашилась
Здравствуйте! Помогите пожалуйста! Нужно сделать так, чтобы программа не...


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

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

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