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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2009, 16:56   #1
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию Проблема с malloc

Здравстуйте, сравнительно недавно начал программировать на с++, сталкнулся вот с какйо пролемой:
Код:
struct list
{
    char ctpoka;
    list *next;
};
int main()
{
    list *LIST;
    LIST->next=(list*)malloc(sizeof(list));
    return 0;
};
при компиляции данного фрагмента кода компилятор зависает, однако при замени строк
Код:
list *LIST;
LIST->next=(list*)malloc(sizeof(list));
на
Код:
list *LIST, *FICT;
FICT=(list*)malloc(sizeof(list));
LIST->next=FICT;
компиляция проходит успешно, я лично в логике данных фрагментов разницы не вижу и не могу понять чем вызвыно такое поведение компилятора, если кто то может ответить, пожалуйта помогите

среда-cb
Обледеневший вне форума Ответить с цитированием
Старый 14.09.2009, 17:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему не пользоваться инструкцией new.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2009, 17:11   #3
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему не пользоваться инструкцией new.
насколько я читал malloc работает незначительно быстрее, даёт слежение за размером выделяемой области памяти, да и после паскаля выглядит он поинтереснее =), но вопрсо не в том сейчас куда интереснее почему первый вариант отказывается работать, в отличии от второго возможно я неправильно понимаю что-то но лично для меня разница в логике незаметна =\
Обледеневший вне форума Ответить с цитированием
Старый 14.09.2009, 17:13   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

А где создание LIST? Указатель объявили, но он ссылается неизвестно куда. Во втором случае, вероятно, повезло просто с указателями так, что программа не умирает.
Либо:
Код:
list LIST;
LIST.next=(list*)malloc(sizeof(list));
либо:
Код:
list *LIST = (list*)malloc(sizeof(list));
LIST->next=(list*)malloc(sizeof(list));
Ну и если изучаете С++, а не Си, то забудьте malloc и сишное приведение типов и изучайте new, delete, static_cast, const_cast, dynamic_cast
pu4koff вне форума Ответить с цитированием
Старый 14.09.2009, 17:25   #5
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию

pu4koff т.е. проблема в отсутствии инициализации?
Цитата:
Сообщение от pu4koff Посмотреть сообщение
Код:
list LIST;
LIST.next=(list*)malloc(sizeof(list));
ещё вопрос по поводу етого кода, здесь между LIST и next "." это описка и там должна быть -> или в языке есть такой элемент?
Обледеневший вне форума Ответить с цитированием
Старый 14.09.2009, 17:32   #6
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Есть 2 варианта:
Код:
list List;
List.next;

list *LIST = new list;
LIST->next;
То есть ты либо просто создаешь объект (как любую переменную), и обращаешься к его членам через точку, либо создаешь указатель на объект, распределяешь под него память вручную, и обращаешься через стрелку. В простых случаях первым способом пользоваться удобнее.

Если ты делаешь последовательность (sequence), в которой каждый объект хранит указатель на следующий, то переменная next всегда будет указателем, так как он должен указывать на другой объект, а не создовать новый. Тогда - никаких malloc или new для него. Иначе он как-то нелогично называется.

Последний раз редактировалось ds.Dante; 14.09.2009 в 17:38.
ds.Dante вне форума Ответить с цитированием
Старый 14.09.2009, 17:42   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Обледеневший Посмотреть сообщение
pu4koff т.е. проблема в отсутствии инициализации?
В принципе: да.
Цитата:
Сообщение от Обледеневший Посмотреть сообщение
ещё вопрос по поводу етого кода, здесь между LIST и next "." это описка и там должна быть -> или в языке есть такой элемент?
Если у нас объект или ссылка на объект, то используется точка. Если же у нас указатель на объект, то, для доступа к членам используется стрелка. В книжке это должно было быть где-то рядом с информацией, что malloc быстрее, чем new
Учти только, что malloc конструктор не вызывает, со всеми вытекающими. Так что потом не нужно удивляться, что код работает как-то не так
pu4koff вне форума Ответить с цитированием
Старый 14.09.2009, 18:06   #8
Обледеневший
 
Регистрация: 14.09.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
В принципе: да.

Если у нас объект или ссылка на объект, то используется точка. Если же у нас указатель на объект, то, для доступа к членам используется стрелка. В книжке это должно было быть где-то рядом с информацией, что malloc быстрее, чем new
Учти только, что malloc конструктор не вызывает, со всеми вытекающими. Так что потом не нужно удивляться, что код работает как-то не так
буду в дальнейшем пользоваться new на цпп
Спасибо за помошь
Обледеневший вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Своя реализация malloc и free Sazary Общие вопросы C/C++ 14 12.09.2009 18:32
malloc free Ошибка. BeNN Общие вопросы C/C++ 19 09.07.2009 12:46
Проблемы с выделением динамической памяти malloc (recalloc) slips Общие вопросы C/C++ 6 29.04.2009 19:27
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37