IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Списки. Ошибка при работе с памятью., Си
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


пишу процедуры для работы со списками (по Кернигану)
Почему при запсуке программы ошибки иполнения ?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct nameval nameval;
struct nameval {
char *name;
int value;
nameval *next;
};

// init

nameval *newitem(char *name, int value) {
nameval *newp;
newp = (nameval *) malloc (sizeof(nameval));
newp->name = name;
newp->value = value;
newp->next = NULL;
return newp;
}

//add new elem tofirst
nameval *addfront (nameval *listp, nameval *newp) {
newp->next=listp;
return newp;
}


//add new elem to end

nameval *addend (nameval *listp, nameval *newp) {
nameval *p;
if (listp == NULL) return newp;
for (p=listp; p->next != NULL; p= p->next)
;
p-> next = newp;
return listp;
}

// search elem

nameval *searchelem (nameval *listp, char *name) {
for (; listp != NULL; listp = listp->next) {
if (strcmp(name,listp->name) ==0)
return listp;
}
return NULL;
}

// free mem

void freeall (nameval *listp) {
nameval *next;
for (; listp != NULL; listp = next) {
next = listp->next;
free(listp);
}
}

//delete elem

nameval *delitem (nameval *listp, char *name) {
nameval *p, *prev;
prev = NULL;
for (p = listp; p != NULL; p = p->next) {
if (strcmp(name, p->name) == 0 ) {
if (prev == NULL)
listp = p->next;
else
prev->next = p->next;
free(p);
return listp;
}
prev=p;
}
// not in list
return NULL;
}

//

// print

int printlist (nameval *listp) {
for (; listp != NULL; listp = listp->next) {
//printf(listp->name);
}
return 0;

}

int main (){
char *s=(char*)malloc (255 *sizeof(char));
nameval *list;
scanf ("%s",s);
//printf(s);
//list = newitem("sdfsdf",0x263A);
//list = addfront(list,newitem("sdfsdf",0x263A));
list = addfront(list,newitem(s,0));
list = addfront(list,newitem(s,0));
// list = addfront(list,newitem(s,0));
//printlist(list);
freeall(list);



}



?

Особо замечу, что все процедуры я взял из книги "Практика программирования" (Брайн Керниган и Роб Пайк).

Разве подобное можно встретить в Паскале ? wacko.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Почему при запсуке программы ошибки иполнения ?
Компилятор какой?

Кстати, уточни, какие именно и где происходят ошибки? У меня в TC 3.0 при полностью раскомментированной программе нет никаких ошибок (хотя программа и выдает не совсем корректный результат)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Компилятор MinGW
Цитата
1232534rhdrh


Terminated with return code -1073741819
Press any key to continue ...

Прикрепленное изображение
Причем если убрать процедуру очистки списка то прога работает без ошибок.
а если запустить вывод списка на экран (раскоментировать пару строчек)
то список выводиться а потом прога вылетает....
вот такие пироги.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Олег, а может, проблема вот в этом (см. аттач, особенно - то, что в красной рамочке, а именно - расширение файла):

(из файла ничего не убиралось, все строки, кроме одного printf раскомментированы)...


Эскизы прикрепленных изображений
Прикрепленное изображение
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
а именно - расширение файла

у меня .cpp blink.gif

Проблемма у меня толи с добавлением элемента толи с просмотром.
Я заменил функцию просмотра на такую:

int printlist (nameval *listp) {
nameval *p;
p=listp;
printf(p->name);
p=p->next;
printf(p->name);

return 0;

}

А в программе так:
int main (){
char *s=(char*)malloc (255 *sizeof(char));
nameval *list;
gets(s);
list = addfront(list,newitem(s,0));
gets(s);
list = addfront(list,newitem(s,0));
printlist(list);
free(s);
//freeall(list);
}

так вот, выводиться 2 элемента которые я ввел вторыми...
Цитата
1234
abcd
abcdabcd

Terminated with return code 0
Press any key to continue ...

Выходит ошибка в добавлении ?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Вот именно в том, что "у тебя СРР" и есть проблема. Программа-то написана на Plain C !!! Поменяй расширение на С и запусти... Как видишь, у меня отработало без сбоев smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Ну я поменял уже, ничего не изменилось.... все та-же проблемма.
(я даже новый проект создал)
Прикрепленное изображение

добавил позже

Все ясно, добавил как у тебя строчку
list=newitem(s,0);
и стало работать.
Конечно, у меня ведь не было выделенна память под самый первый получается...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 23.08.2017 13:07
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"