Одесса: 6°С (вода 9°С)
Киев: 1°С
Львов: 6°С

Тема: Хелп (двусвязный список)

Закрытая тема
Показано с 1 по 17 из 17
  1. Вверх #1
    Anonymous
    гость

    По умолчанию Хелп (двусвязный список)

    Такая ерунда блин.... вот в чем дело:

    Есть структура

    struct anystruct

    {
    anystruct* prev;
    ......................
    ......................
    anystruct* next;
    };


    В Main:

    {
    anystruct* mystruct;
    mystruct = (anystruct*) malloc(sizeof(anystruct));

    // заполнение полей.....

    ................................
    ................................

    // заполнение списка:

    anystruct* body;
    anystruct* tail;

    do

    {
    body=tail;

    tail=(anystruct*) malloc(sizeof(anystruct));

    body->next=tail;

    tail->prev=body;

    tail->next=NULL;

    ........................
    ..........................

    scanf("%d",tail->variable); // на этом месте в первой же итерации в
    // линухе - segmentation fault
    // в винде - GPF (General protection fault)

    }

    while(<условие прекращения>);

    .................................................. .................................................. ................
    что делать? в чем проблема (ошибка) ?

    З.Ы. в винде юзал Borland C++ Builder 6.x
    под линухом g++ одна из последних версий....


  2. Вверх #2
    чужой код - это нечто, даже такой элементарный... всегда хочется не искать ошибки, а переписать по-своему
    Ну, во-первых, что проблемы с обращением к невыделенной памяти - это, я думаю, ты сам понимаешь...

    body=tail;

    Тебя не смущает, что ты инициализируешь один "дикий" указатель другим?
    malloc - это из принципа или как?
    Не будите во мне Зверя, он и так не высыпается

  3. Вверх #3
    Anonymous
    гость
    Ну, а почему ты решил, что body=tail - присвоение неинициализированных указателей? до первой итерации tail показывает на голову списка, а потом он вроде уже как бы выделяет себе память, кстати, malloc - действительно из принципа, new как-то попсово

    ах, да.... я просто в примере протупил, я писал до оператора "do" строчку tail=mystruct;

  4. Вверх #4
    хм... ты бы все-таки _рабочий_ код выкладывал, что ли...
    тогда все правильно, и собственно не в списке дело, а в scanf.
    Как-то вначала не обратила внимание... Надо:

    scanf("%d",&tail->variable);

    Функция-то должна принимать _адрес_ переменной...
    Не будите во мне Зверя, он и так не высыпается

  5. Вверх #5
    Anonymous
    гость
    Tigra, ОООО!!!!!!!!! Спасибо.

    Хотя char* variable вроде и так адрес начала строкового массива....

  6. Вверх #6
    З.Ы. За malloc - глубокий респект
    Только вот код на new и malloc генерится абсолютно одинаковый проверено
    Не будите во мне Зверя, он и так не высыпается

  7. Вверх #7
    Anonymous
    гость
    а когда я пишу scanf("%s",tail->var2), где

    char* var2; var2- тоже ж указатель, та же ерунда

  8. Вверх #8
    С char* никаких проблем быть не должно... Ты, главное, память под него не забывай выделять
    Не будите во мне Зверя, он и так не высыпается

  9. Вверх #9
    Anonymous
    гость
    Tigra, Но они есть. Тоже в первой же итерации... опять ошибка сегментации

  10. Вверх #10
    Хм... Ну так я ничего не могу сказать... и никто не может... потому что из того кода, что ты выложил, видно только что у тебя есть int variable, в которую ты сканишь %d - цифирю, то есть....
    Так что, если действительно нужен совет - выложи _реальный_, полный код. Иначе это будут только догадки...
    Не будите во мне Зверя, он и так не высыпается

  11. Вверх #11
    Anonymous
    гость
    Tigra, Уже все ОК.... просто в одном месте неправильно выделил память...

  12. Вверх #12
    Anonymous
    гость
    Tigra,
    Только вот код на new и malloc генерится абсолютно одинаковый проверено
    Хех... странно. Смотрим объект

    class Any_Class

    {
    .........................
    .........................
    }


    -------------------------------------------------


    Any_Class* a;
    Any_Class* b;

    a = new Any_Class; // Здесь конструктор срабатывает
    b = (Any_Class*) malloc(sizeof(Any_Class)); // А здесь нет!

  13. Вверх #13
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    На сколько я знаю, New автоматически создаёт объект нужного размера, запускает его конструктор и возвращяет указатель...
    а malloc не обеспечивает инициализацию выделенного куска памяти....
    ~ Motivation is what gets you started. Habit is what keeps you going.

  14. Вверх #14
    Anonymous
    гость
    Яр, ПРРРРААААЛЬНО! Йесть такая бухва в этом слове...

    Вот почему тех, кто раньше кодил на С отучают пользоваться alloc'ами и free() и приучают к new и delete....

  15. Вверх #15
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    Причём, кажысь, если создать объекто с помощью new, он не удалится с помощью free, и наоборот, созданный при помощи malloc не удалится с помощью delete
    ~ Motivation is what gets you started. Habit is what keeps you going.

  16. Вверх #16
    Anonymous
    гость
    Особенно прикольно создавать динамические экземпляры объектов, полученных с использованием multiply inheritance, посредством *alloc функций.... Но что то мы уклонились от темы, которая себя исчерпала. Вроде ее пора закрыть.

  17. Вверх #17
    Постоялец форума Аватар для Яр
    Пол
    Мужской
    Адрес
    Odessa.Ua
    Возраст
    30
    Сообщений
    2,952
    Репутация
    148
    Тема торжественно закрыта :)
    ~ Motivation is what gets you started. Habit is what keeps you going.


Закрытая тема

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения