-
Хелп (двусвязный список)
Такая ерунда блин.... вот в чем дело:
Есть структура
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++ одна из последних версий....
-
чужой код - это нечто, даже такой элементарный... всегда хочется не искать ошибки, а переписать по-своему:)
Ну, во-первых, что проблемы с обращением к невыделенной памяти - это, я думаю, ты сам понимаешь...
body=tail;
Тебя не смущает, что ты инициализируешь один "дикий" указатель другим?
malloc - это из принципа или как?:)
-
Ну, а почему ты решил, что body=tail - присвоение неинициализированных указателей? до первой итерации tail показывает на голову списка, а потом он вроде уже как бы выделяет себе память, кстати, malloc - действительно из принципа, new как-то попсово :)
ах, да.... я просто в примере протупил, я писал до оператора "do" строчку tail=mystruct;
-
хм... ты бы все-таки _рабочий_ код выкладывал, что ли...
тогда все правильно, и собственно не в списке дело, а в scanf.
Как-то вначала не обратила внимание... Надо:
scanf("%d",&tail->variable);
Функция-то должна принимать _адрес_ переменной...
-
[b]Tigra[/b], ОООО!!!!!!!!! Спасибо.
Хотя char* variable вроде и так адрес начала строкового массива....
-
З.Ы. За malloc - глубокий респект:)
Только вот код на new и malloc генерится абсолютно одинаковый:) проверено
-
а когда я пишу scanf("%s",tail->var2), где
char* var2; var2- тоже ж указатель, та же ерунда :(
-
С char* никаких проблем быть не должно... Ты, главное, память под него не забывай выделять
-
[b]Tigra[/b], Но они есть. Тоже в первой же итерации... опять ошибка сегментации :(
-
Хм... Ну так я ничего не могу сказать... и никто не может... потому что из того кода, что ты выложил, видно только что у тебя есть int variable, в которую ты сканишь %d - цифирю, то есть....
Так что, если действительно нужен совет - выложи _реальный_, полный код. Иначе это будут только догадки...
-
[b]Tigra[/b], Уже все ОК.... просто в одном месте неправильно выделил память...
-
[b]Tigra[/b], [quote]Только вот код на new и malloc генерится абсолютно одинаковый:) проверено [/quote]
Хех... странно. Смотрим объект
class Any_Class
{
.........................
.........................
}
-------------------------------------------------
Any_Class* a;
Any_Class* b;
a = new Any_Class; // Здесь конструктор срабатывает
b = (Any_Class*) malloc(sizeof(Any_Class)); // А здесь нет!
-
На сколько я знаю, New автоматически создаёт объект нужного размера, запускает его конструктор и возвращяет указатель...
а malloc не обеспечивает инициализацию выделенного куска памяти....
-
[b]Яр[/b], ПРРРРААААЛЬНО! Йесть такая бухва в этом слове...
Вот почему тех, кто раньше кодил на С отучают пользоваться alloc'ами и free() и приучают к [b]new [/b] и [b]delete[/b]....
-
Причём, кажысь, если создать объекто с помощью new, он не удалится с помощью free, и наоборот, созданный при помощи malloc не удалится с помощью delete
-
Особенно прикольно создавать динамические экземпляры объектов, полученных с использованием multiply inheritance, посредством *alloc функций.... Но что то мы уклонились от темы, которая себя исчерпала. Вроде ее пора закрыть.
-
Тема торжественно закрыта :)