почему мы используем sizeof с помощью malloc?[закрыто]
-
23-12-2019 - |
Вопрос
Какова цель использования sizeof
с помощью malloc
в C
?Зачем это необходимо?
Я имею в виду, что мы можем использовать sizeof
но мы уже знаем размер (=1000 байт) того, что мы выделяем в памяти?
Я новичок в C so.Это может быть очень очевидный вопрос.
Решение
Типы Данных и Память Имеют значение
Ответ кроется в типах данных.Пока ты знаешь сколько объектов для чего вы хотите выделить память, возможно, вам не захочется утруждать себя мысленным вычислением их размера.
Так же как и ремонтопригодность
Кроме того, что, если состав этих изменений изменится позже?Тогда вы облажались, и вам придется все редактировать.
Так что в вашем примере это не имеет значения без контекста.Но в случае, когда вы хотите выделить память для более сложных вещей (скажем, для структуры с несколькими полями), это становится довольно важным и полезным.
Пример 1 (здесь это не так важно):
char *s = malloc(100 * sizeof(char));
Но, эй, это просто char
с, все в порядке, ты мог бы это сделать:
char *s = malloc(100);
В целом работает.Но выстрелить себе в ногу, как вы увидите ниже.
Пример 2 (уже немного имеет значение):
int *i = malloc(100 * sizeof(int));
Конечно, вы могли бы написать это:
int *i = malloc(100 * 4);
То есть, предполагая, что вы разрабатываете только для одной архитектуры, которую вы довольно хорошо знаете.
Пример 3 (начинает иметь немаловажное значение!):
typedef struct s_listelement{
int dataitem;
struct s_listelement *link;
} t_listelement;
t_listement *le = malloc(sizeof(t_listelement));
Теперь представьте, что структура элемента связанного списка содержит множество других полей...
Хотели бы вы доверять sizeof()
, или пойти повеселиться и посчитать самому?
Другие советы
Предположим, вы хотите выделить память для хранения int
s.Ваше первоначальное предположение будет таким: "Хорошо, мне нужно иметь n
целые числа, и каждое целое число требует x
байты.Таким образом, пространство будет n*x
байты.
Но на самом деле это x
зависит от архитектуры.Это может быть 16-битный, 32-битный и т.д.Поэтому, чтобы ваш код мог работать в различных средах, рекомендуется использовать n*sizeof(int)
вместо n*x
.
Например, если вам нужно выделить место для 10 целых чисел:
int *p=malloc(sizeof(int)*10);
Что произойдет, если вы измените размер mallocated
?
Вам нужно будет 1) снова вычислить новый размер (оставляя в стороне проблемы с несколькими целевыми архитектурами, когда вам придется вычислять новый размер в каждой цели), 2) выполнить поиск по всем malloc(1000)
, убедитесь , что это относится к mallocated
(что может быть неочевидно) и замените на новый размер.
У вас нет ни одной из этих 2-х проблем при использовании sizeof
.Таким образом, используя sizeof
приводит к созданию более удобного в обслуживании и читаемого кода.