Menu
Coddy logo textTech

Использование sizeof() для выделения памяти

Часть раздела Logic & Flow путешествия по 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() позволяет вашему коду корректно работать на различных системах, где типы данных могут иметь разные размеры, и это четко передает ваше намерение выделить место для определенного количества элементов конкретного типа.

challenge icon

Задание

Легко

Напишите программу на языке C, которая демонстрирует правильное использование sizeof() вместе с malloc() для динамического выделения памяти. Ваша программа должна:

  1. Считать целое число n от пользователя, представляющее количество элементов для выделения памяти
  2. Использовать malloc() с sizeof() для динамического выделения памяти под массив из n значений типа double
  3. Привести возвращаемый указатель типа void к указателю на double
  4. Считать n значений типа double от пользователя и сохранить их в выделенном массиве
  5. Рассчитать общий объем выделенной памяти в байтах и вывести его в формате: Memory allocated: [bytes] bytes
  6. Рассчитать и вывести среднее арифметическое всех значений ровно с 2 знаками после запятой в формате: Average: [value]
  7. Найти и вывести наибольшее значение ровно с 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow