Menu
CoddyTech

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

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Проверьте себя

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C