Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Winhttp
60 / 60 / 5
Регистрация: 05.01.2013
Сообщений: 235
#1

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

08.02.2013, 02:33. Просмотров 1626. Ответов 5
Метки нет (Все метки)

не работает пример из лекции , там пример на доске такой написан -
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
запутанно чтото все, и смысла уловить не могу во всем этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2013, 02:33
Ответы с готовыми решениями:

Динамическое выделение памяти malloc()
Здравствуйте! Cкажите пожалуйста, как узнать каков максимальный объем...

Выделение памяти malloc realloc
мне задачу поставили, надо не используя stl, загрузить из файла данные. r -...

Выделение памяти с использованием malloc
Доброго времени суток :) В общем есть следующий класс: class Addres { char...

Выделение памяти malloc приводит к неправильным расчетам
Есть функция которая постоянно вызывается для расчетов. Она работает...

Выделение памяти через malloc и считывание данных
Здравствуйте. Имеется файл, в котором 6 чисел типа double. В программе имеется...

5
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
08.02.2013, 02:43 #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)));
1
Winhttp
60 / 60 / 5
Регистрация: 05.01.2013
Сообщений: 235
08.02.2013, 04:10  [ТС] #3
а чем отличается
C++
1
 static_cast<int*>
от того же
C++
1
(int *)
?
0
Dekio
Фрилансер
Эксперт С++
5838 / 1219 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
08.02.2013, 10:21 #4
Разница в том, что язык С не знает разницы между cast'aми (const_cast, reinterpret_cast и т.д.), которые по разному работают и нужны для разных целей. Причина использования static_cast в том, что он безопасен и использует указанные правила приведения типов.
1
-=ЮрА=-
Заблокирован
Автор FAQ
08.02.2013, 11:22 #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
1
Croessmah
++Ͻ
14503 / 8285 / 1556
Регистрация: 27.09.2012
Сообщений: 20,336
Записей в блоге: 3
Завершенные тесты: 1
08.02.2013, 11:31 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
жуёт Си код и без операций приведения типа
в Си это вполне нормально.
Неявное преобразование от void* запрещено в плюсах
1
08.02.2013, 11:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2013, 11:31

Динамическое выделение памяти под структуру (malloc)
Нашел данное решение на этом форуме, но никак не могу понять как оно работает....

Освобождение памяти malloc free
В общем работаю над расширением для php (для тренировки в php и в c++ сразу)...

Выход за пределы выделенной памяти (new, malloc)
День был пасмурный... Чашка чая помогала не заснуть перед монитором... На...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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