#c #malloc
Нужно создать массив с помощью malloc. Как я прочитал есть два способа записи этой функции: int * buffer = malloc (i * sizeof (int)); и int *buffer = (int *) malloc (i); Но, когда я пытаюсь очистить выделенную память после того как использовал вторую запись, то программа вылетает. В остальном же никакой разницы не заметил. Что я сделал не так?
Ответы
Ответ 1
Во-первых, ваши два способа почти никак между собой не связаны: в первом фигурирует sizeof(int), а во втором его не видно. Поэтому не понятно, прочему вы их вообще привели вместе. Также, в соответствии с такой логикой составления "способов", не составит труда придумать еще пятьдесят два "способа записи этой функции", поэтому не ясно, почему ваш источник утверждает, что их всего два. Во-вторых, явное приведение типа возвращаемого значения malloc (как во втором способе) - ненужная, бессмысленная и вредная практика. (см. также DRY ниже) В-третьих, для выделения памяти под массив через malloc существует прекрасная идиома, построенная в соответствии с принципом DRY (Don't Repeat Yourself) int *buffer = malloc(i * sizeof *buffer); // Полагая, что `i` - требуемый размер массива Обратите внимание, что конкретное имя типа в этом варианте упоминается только один-единственный раз - в объявлении переменной. Именно (и только) в объявлениях и должны упоминаться конкретные типы. Остальной код, за пределами объявлений, в идеале, должен быть типонезависим (type-agnostic), т.е. не содержать никаких упоминаний имен типов вообще. Это не всегда достижимо, но в случае выделения памяти через malloc это вполне возможно.Ответ 2
Вы выделили слишком мало памяти. При работе вы вышли за границы выделенной памяти, затерли служебную информацию диспетчера памяти и при освобождении памяти произошли неприятности... malloc выделяет указанное количество байт, так что если вам нужна память для N целых чисел - то выделяйте malloc(N*sizeof(int)).
Комментариев нет:
Отправить комментарий