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

Выделение памяти malloc - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Winhttp
59 / 59 / 0
Регистрация: 05.01.2013
Сообщений: 235
08.02.2013, 02:33     Выделение памяти malloc #1
не работает пример из лекции , там пример на доске такой написан -
C++
1
2
3
4
5
6
#include <stdlib.h>
int main()
{
    int *p=malloc(10000*sizeof(int));//выделили память
    free(p);//освободили
}
но такой пример отказывается компилироваться с ошибкой
Код
error: invalid conversion from 'void*' to 'int*' [-fpermissive]|
тоесть, указатель должен быть void*? и как с ним работать тогда?
вот такая запись скомпилируется нормально:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <windows.h>
#include <stdlib.h>
 
 
int main()
{
    void *p=malloc(40000*sizeof(int));//выделили память
    free(p);//освободили
}
но если первой ячейке , ну или элементу присвоить какое то значение, то программа не скомпилируется
C++
1
p[0]=1
еще вопрос по поводу void - из других ЯП я знаю, что это ключевое слово, которое означает, что функция ничего не возвращает, поэтому не могу понять, причем тут void в начале функции, если она возвращает указатель? это тип указателя, как я понял?
в гугле нашел следующее
void* - обобщенный тип указателя, т.е. не привязанный к какому-либо конкретному типу
, ну и как с ним работать?

вот сама лекция на том месте с примером -

Добавлено через 7 минут
и не подскажете, что значат значения функции в начале -
C++
1
_CRTIMP void* __cdecl __MINGW_NOTHROW   malloc  (size_t) __MINGW_ATTRIB_MALLOC;
ну - _CRTIMP, __cdecl __MINGW_NOTHROW, и в конце - __MINGW_ATTRIB_MALLOC
запутанно чтото все, и смысла уловить не могу во всем этом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
08.02.2013, 02:43     Выделение памяти malloc #2
Цитата Сообщение от Winhttp Посмотреть сообщение
#include <stdlib.h>
int main()
{
* * int *p=malloc(10000*sizeof(int));//выделили память
* * free(p);//освободили
}
Очевидно, этот пример изначально был написан на C а не на C++. В C++ void* к целевому типу необходимо приводить явно
C++
1
int *p = static_cast<int*>(malloc(10000 * sizeof(int)));
Winhttp
59 / 59 / 0
Регистрация: 05.01.2013
Сообщений: 235
08.02.2013, 04:10  [ТС]     Выделение памяти malloc #3
а чем отличается
C++
1
 static_cast<int*>
от того же
C++
1
(int *)
?
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
08.02.2013, 10:21     Выделение памяти malloc #4
Разница в том, что язык С не знает разницы между cast'aми (const_cast, reinterpret_cast и т.д.), которые по разному работают и нужны для разных целей. Причина использования static_cast в том, что он безопасен и использует указанные правила приведения типов.
-=ЮрА=-
Заблокирован
Автор FAQ
08.02.2013, 11:22     Выделение памяти malloc #5
Winhttp, на лекциях вам дали выделение памяти в Си. static_cast для плюсов, (type *) для Си вот и всё. В Си другой механизм обработки ошибок и ряд прочих тонкостей, потому если написать вот так
#include <stdlib.h>
int main()
{
* * int *p= static_cast<int*>malloc(10000*sizeof(int));//выделили память
* * free(p);//освободили
return 0;
}
- это будет ошибкой для Си (в нём попросту нет cast)
http://codepad.org/5rjXLo7Y
error: 'static_cast' undeclared (first use in this function)
А вот с (int *) всё будет компилироваться норм
http://codepad.org/LEEy0hyf
Output:
No errors or program output.
Хотя, хотя codepad - овский Си компилятор жуёт Си код и без операций приведения типа http://codepad.org/01AMLwLL
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,910
Записей в блоге: 2
Завершенные тесты: 1
08.02.2013, 11:31     Выделение памяти malloc #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
жуёт Си код и без операций приведения типа
в Си это вполне нормально.
Неявное преобразование от void* запрещено в плюсах
Yandex
Объявления
08.02.2013, 11:31     Выделение памяти malloc
Ответ Создать тему
Опции темы

Текущее время: 15:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru