Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2012, 02:50   #1
M9ICKO
 
Регистрация: 23.07.2012
Сообщений: 4
По умолчанию функция malloc

В компиляторе visual studio 2010 столкнулся со следующей проблемой:

#include <stdio.h>
#include <stdlib.h>

void main()
{
char *s;
int *xPtr;

s = malloc(10);
}

Строку "s = malloc(10);" выделяет и пишет ошибку: значение типа "void *" нельзя присвоить сущности типа "char *".
Подскажите, что не так=\
M9ICKO вне форума Ответить с цитированием
Старый 23.07.2012, 02:56   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

C++ запрещает неявное преобразование void * к другому типу указателя. Чтобы работало, нужно производить явное преобразование с помощью static_cast, reinterpret_cast или C-го преобразования. Ну или использовать C, где подобные преобразования производятся автоматически.
Код:
s = static_cast<char *> (malloc (10));
// или
s = reinterpret_cast<char *> (malloc (10));
// или
s = (char *)malloc (10);
Последнее не рекомендуют в C++, но в целом тоже можно использовать.
netrino вне форума Ответить с цитированием
Старый 23.07.2012, 03:02   #3
M9ICKO
 
Регистрация: 23.07.2012
Сообщений: 4
По умолчанию

Книгу по С читаю. Создал консольное приложение. Добавил исходный код .cpp. <= Тут явное преобразование не прокатывает?
M9ICKO вне форума Ответить с цитированием
Старый 23.07.2012, 03:03   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от M9ICKO Посмотреть сообщение
Книгу по С читаю. Создал консольное приложение. Добавил исходный код .cpp. <= Тут явное преобразование не прокатывает?
Не прокатывает. Переименуйте .cpp файл в .c, тогда должно прокатывать.
netrino вне форума Ответить с цитированием
Старый 23.07.2012, 03:04   #5
M9ICKO
 
Регистрация: 23.07.2012
Сообщений: 4
По умолчанию

Спасибо за своевременную помощь)
M9ICKO вне форума Ответить с цитированием
Старый 23.07.2012, 03:11   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от M9ICKO Посмотреть сообщение
Спасибо за своевременную помощь)
Не стоит благодарности
netrino вне форума Ответить с цитированием
Старый 23.07.2012, 10:57   #7
Mrbober
Пользователь
 
Регистрация: 18.02.2011
Сообщений: 24
По умолчанию

Попробуй так, тоже должно сработать.

s = (char*) malloc(10);
Mrbober вне форума Ответить с цитированием
Старый 23.07.2012, 15:02   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

2 Mrbober
Не читатель или просто постонабиватель? Второй пост темы смотрим.
p51x вне форума Ответить с цитированием
Старый 23.07.2012, 20:23   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Код:
s = static_cast<char *> (malloc (10));
// или
s = reinterpret_cast<char *> (malloc (10));
// или
s = (char *)malloc (10);
Последнее не рекомендуют в C++, но в целом тоже можно использовать.
В чем принципиальное отличие второго способа от последнего?

Никак не могу понять, почему неуклюжую, уродливо-длинную, и не безопасную reinterpret_cast рекомендуют, как альтернативу приведению в стиле си, если приведение в стиле си, делает суть тоже самое?

Но более лаконичная, короткая, и не режет глаз?
_Bers вне форума Ответить с цитированием
Старый 23.07.2012, 20:54   #10
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Я думаю, потому, что этим говорят: "Так, вот щас будет полный писец, тартар, тьма и педерастия; не пытайтесь повторить это дома, я честно предупредил!" Т.е. дело не в кастах, а в сишной конструкции - если вместо каста написать ее, то будет непонятно, осознанно ли это сделано, или автор забивает гвозди микроскопом, когда мог бы использовать, например, static_cast.

Разумеется, подразумевается, что у кодера есть полное понимание, и он никогда не использует приведение в стиле Си или reinterpret_cast, когда мог бы обойтись малой кровью.

P.S. Но, да, когда используется malloc, я предпочитаю приведение в стиле Си для единообразия. Во-первых, это такая же идиома, как "Hello, world", во-вторых, сишное приведение - к аллокам, касты - к new. Им вместе привычнее.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 23.07.2012 в 20:58.
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
malloc в С++ _Kitten_ Помощь студентам 2 12.12.2011 19:20
Malloc Sabin4ik Общие вопросы C/C++ 12 18.02.2011 01:13
функция malloc() для разного типа переменной. Serjuk Помощь студентам 46 05.01.2010 21:52
SIEGSEGV в malloc() TheVampire Общие вопросы C/C++ 0 25.09.2009 14:32
Проблема с malloc Обледеневший Общие вопросы C/C++ 7 14.09.2009 18:06