Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Starstuck
4 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 124
#1

Каково назначение функции malloc - C++

01.11.2012, 14:13. Просмотров 630. Ответов 9
Метки нет (Все метки)

Вот решенная задача:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
struct athlet
{
    long m;
    long pow;
    athlet()
    {
        m=0;
        pow=0;
    }
};
 
int compare (const void * a, const void * b)
{
    athlet aa=*(athlet*)a;
    athlet bb=*(athlet*)b;
    return (aa.m==bb.m ? aa.pow-bb.pow : aa.m-bb.m);
}
 
int main()
{
 
    long n;
    scanf("%i", &n);
    athlet *mass; // Введем указатель *mass типа athlet
    mass=(athlet*)malloc(n*sizeof(athlet)); // создадим динамически массив
    for(long i=0;i<n;i++)
        scanf("%i %i", &mass[i].m, &mass[i].pow);
    qsort(mass, n, sizeof(athlet), compare);
    
    long res=1;
    long now=(*mass).m;
    for(long i=1;i<n;i++)
        if(mass[i].pow>=now)
        {
            res++;
            now+=i[mass].m;
        }
 
    printf("%i", res);
        system ("pause");
}
Не понимаю данную строку mass=(athlet*)malloc(n*sizeof(athlet));
Т.е. мы создаем динамически массив и указатель на него будет mass? А что такое (athlet*)?
Подскажите пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 14:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Каково назначение функции malloc (C++):

Какие есть специальные символы и каково их назначение? - C++
какие в с++ есть специальные символы и каково их назначение?

функции на основе realloc, malloc - C++
Подскажите как сократить написание &quot;realloc&quot;, а то надоели эти писанины))) вот сделал уже следующее: size_t GetSize(void* Array) ...

Как создать динамический двумерный массив с использованием функции malloc? - C++
Я создаю динамический двумерный массив вот так: int **arr = (int**)malloc(m*sizeof(int*)); //объявление матрицы на экран ...

Выделить память под двумерный массив за один вызов функции malloc - C++
Выделить память под двумерный массив за один вызов функции malloc Если можно - с комментариями

Объясните назначение функции класса - C++
class Cl { .... void f(); } Cl func() {.. } // что это за функция, в чем ее смысл ? Cl() {.. } void f(){.. } int main() { ...

Назначение mutable в лямбда-функции - C++
Прокомментируйте, чтоб не выдумывать. Спецификатор mutable определяет по списку захвата локальные статические переменные? int main() {...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
01.11.2012, 14:15 #2
приведение к типу, а именно к твоей структуре атлет
ksandro
31 / 31 / 1
Регистрация: 15.04.2011
Сообщений: 81
01.11.2012, 14:15 #3
функция malloc возвращает указатель типа void*
(athlet*) - операция преобразования к типу athlet*
OhMyGodSoLong
01.11.2012, 14:17
  #4

Не по теме:

В Си, btw, это преобразование автоматическое.

Starstuck
4 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 124
01.11.2012, 14:18  [ТС] #5
Tiva,
ksandro,
~OhMyGodSoLong~,

Спасибо, понял.

А что означает эта строка?
18. athlet aa=*(athlet*)a;
serejkus
47 / 45 / 4
Регистрация: 31.10.2011
Сообщений: 98
01.11.2012, 14:18 #6
В данном случае malloc выделяет память, равную n * (размер структуры athlet), т.е. для n элементов athlet. Почитать подробнее про malloc можно в одкументации (или man 3 malloc).
(athlet*) - это приведение к типу "указатель на athlet". В C/C++ массивы и указатели тесно связаны - массив является указателем на первый элемент.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
01.11.2012, 14:19 #7
Цитата Сообщение от Starstuck Посмотреть сообщение
18. athlet aa=*(athlet*)a;
Привидение указателя и его разыменование.
Starstuck
4 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 124
01.11.2012, 14:26  [ТС] #8
Croessmah, что означает приведение указателя?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.11.2012, 14:30 #9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
/* функция принимает указатели на тип void* = сырые указатели на "какой-то кусок памяти" */
int compare (const void * a, const void * b)
{
    /* (athlet*)a = преобразуем "указатель на какой-то кусок памяти"
         в "указатель на кусок памяти, где лежит struct athlet"
 
       athlet aa=*(athlet*)a = копируем в aa тот struct athlet,
         который лежит в куске памяти, на который указывает a
    */
    athlet aa=*(athlet*)a;
    athlet bb=*(athlet*)b;
    return (aa.m==bb.m ? aa.pow-bb.pow : aa.m-bb.m);
}
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
01.11.2012, 14:32 #10
Цитата Сообщение от Starstuck Посмотреть сообщение
что означает приведение указателя?
Преобразование к типу athlet*
то же самое, что и с malloc:
Цитата Сообщение от ksandro Посмотреть сообщение
функция malloc возвращает указатель типа void*
(athlet*) - операция преобразования к типу athlet*
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2012, 14:32
Привет! Вот еще темы с ответами:

Назначение аргументов функции int main - C++
int main(int argc, char *argv) что эти параметры делают и какие у них функции, объясните пожалуйста!

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? - C++
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают...

Объяснить назначение и нюансы работы функции strtok() - C++
Что делает это? for (char *p = strtok(str, del); p; p = strtok(NULL, del)) а именно ; p; p = strtok(NULL, del))

Не могу определить назначение функции и то что она делает - C++
#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; struct llist{ int val; llist *next,*prev; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.11.2012, 14:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru