Структуры - ошибка доступа к памяти - C (СИ)
Формулировка задачи:
Вроде все написано правильно, но компилер ругается при попытке создать второй елемент...
Попрошу не пугатся немецкого, имена функций все же на англиском, заранее спасибо.
Вот код:
#include<stdio.h> #include<stdlib.h> struct listElem { /*Liste Struktur*/ int key; struct listElem* next; /*Zeiger auf das naechste Element*/ }; struct listElem* head=NULL; /*Zeiger uaf das erste Element*/ struct listElem* next=NULL; void init(int k){ /*Funktion haengt neues Element(Struktur) in der Liste an*/ struct listElem* ptr; if(head==NULL){ if((head=(struct listElem*)malloc(sizeof(*head)))!=NULL){ head->key=k; head->next=NULL; } else{ printf("\n\tSpeicherFehler!!!\n"); } } else{ ptr=head; while(ptr->next!=NULL){ ptr=ptr->next; } if((ptr->next=(struct listElem*)malloc(sizeof(*ptr)))!=NULL){ next->key=k; ptr->next=NULL; } else{ printf("\n\tSpeicherFehler!!!\n"); } } } void input(void){ /*Funktion zur Datenangabe*/ int k; printf("\n\n\tGeben Sie Kennung an: "); scanf("%i", &k); printf("\n"); init(k); } void output(void){ struct listElem* ptr; ptr=head; while(ptr!=NULL){ printf("\n\n\tKennung: %i",ptr->key); ptr=ptr->next; } printf("\n"); } int main(void){ /*printf("\n%d\t%d",sizeof(*head),sizeof(struct listElem) ); printf("\n%d\n",head); input(); printf("\n%u\t%d\n",*head,head); output();*/ int i; printf("\n\n\t\t\t\tWillkommen in Ihre CD_Verwaltung Programm\n "); do{ printf("\n\tNeue CD angeben ------------------> 1"); printf("\n\tIhre CD-Liste anzeigen -----------> 2"); printf("\n\tCD-Antrag loeschen ---------------> 3"); printf("\n\tCD-Suchen ------------------------> 4"); printf("\n\tProgramm beenden -----------------> 0"); printf("\n\n\tWaehlen Sie Ihr naechstes Schritt: "); scanf("%i",&i); switch(i){ case 1: input(); break; case 2: output(); break; case 3: case 4: case 0: break; default: printf("\n\t\t!!!FALSCHE ANGABE!!!\n"); } }while(i!=0); }
не компилер, а линукс ругается, ошибка доступа к памяти...
Решение задачи: «Структуры - ошибка доступа к памяти»
textual
Листинг программы
if((ptr->next=(struct listElem*)malloc(sizeof(*ptr)))!=NULL) { next->key=k; ptr->next=NULL; }
Объяснение кода листинга программы
В представленном коде выполняются следующие действия:
- Выделяется память под новый элемент списка с помощью функции
malloc
. - Если выделенная память не равна
NULL
(то есть, если выделение памяти прошло успешно), то выполняются следующие действия:- Значение
k
присваивается полюkey
следующего элемента списка (next
). - Устанавливается указатель на следующий элемент списка (
ptr->next
). - Устанавливается указатель
ptr
на начало списка (на первый элемент). Если выделение памяти не удалось (то есть, еслиmalloc
вернулNULL
), то ничего не делается.
- Значение
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д