Использование sizeof() для выделения памяти
Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 33 из 63.
Хотя malloc() позволяет динамически выделять память, существует важная рекомендация, которая делает ваш код более переносимым и удобным в сопровождении: использовать оператор sizeof(), чтобы определить, сколько байтов выделить.
Оператор sizeof() возвращает количество байтов, необходимых для хранения определённого типа данных в вашей системе. Вместо того чтобы задавать размеры в байтах напрямую, вы можете позволить sizeof() автоматически вычислить правильное количество:
// Вместо того чтобы угадывать размер в байтах:
int *ptr = (int*)malloc(4); // Предполагается, что int занимает 4 байта
// Используйте sizeof() для переносимости:
int *ptr = (int*)malloc(sizeof(int)); // Всегда корректноЭтот подход становится особенно полезным при выделении памяти для массивов. Чтобы выделить память для нескольких элементов, умножьте количество элементов на размер каждого элемента:
// Выделить память для 10 целых чисел
int *arr = (int*)malloc(10 * sizeof(int));
// Выделить память для 5 чисел типа double
double *values = (double*)malloc(5 * sizeof(double));Использование sizeof() позволяет вашему коду корректно работать в разных системах, где типы данных могут иметь разный размер, и ясно показывает, что вы хотите выделить место для определённого количества элементов заданного типа.
Задание
ЛегкоНапиши программу на C, демонстрирующую правильное использование sizeof() с malloc() для динамического выделения памяти. Твоя программа должна:
- Считать у пользователя целое число
n, обозначающее количество элементов для выделения - Использовать
malloc()сsizeof(), чтобы динамически выделить память для массива изnзначений типа double - Привести возвращённый указатель void к указателю на double
- Считать у пользователя
nзначений типа double и сохранить их в выделенном массиве - Вычислить общий объём выделенной памяти в байтах и вывести его в формате:
Memory allocated: [bytes] bytes - Вычислить и вывести среднее значение всех чисел с точностью ровно до 2 знаков после запятой в формате:
Average: [value] - Найти и вывести наибольшее значение с точностью ровно до 2 знаков после запятой в формате:
Largest: [value]
Не забудь подключить заголовочный файл <stdlib.h>, чтобы использовать malloc(). Твоя программа должна показать, как sizeof() обеспечивает правильное выделение памяти независимо от размеров типов данных в системе.
Например, если ввод такой:
3
2.5 7.8 4.1Вывод должен быть таким:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Это задание закрепляет важность использования sizeof(), чтобы сделать динамическое выделение памяти переносимым и удобным для сопровождения: оно автоматически вычисляет правильное количество байтов, необходимое для любого типа данных в любой системе.
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
int main() {
// Считайте количество элементов
int n;
scanf("%d", &n);
// TODO: Напишите свой код ниже
// 1. Выделите память для n значений типа double с помощью malloc() и sizeof()
// 2. Приведите возвращённый указатель к типу double*
// 3. Считайте n значений типа double и сохраните их в выделенном массиве
// 4. Вычислите и выведите объём выделенной памяти в байтах
// 5. Вычислите и выведите среднее значение с 2 знаками после запятой
// 6. Найдите и выведите наибольшее значение с 2 знаками после запятой
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массивПотренируйтесь самостоятельно: Онлайн-компилятор C