Структуры - ошибка доступа к памяти - 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), то ничего не делается.
- Значение