Структуры - ошибка доступа к памяти - 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;
        }

Объяснение кода листинга программы

В представленном коде выполняются следующие действия:

  1. Выделяется память под новый элемент списка с помощью функции malloc.
  2. Если выделенная память не равна NULL (то есть, если выделение памяти прошло успешно), то выполняются следующие действия:
    • Значение k присваивается полю key следующего элемента списка (next).
    • Устанавливается указатель на следующий элемент списка (ptr->next).
    • Устанавливается указатель ptr на начало списка (на первый элемент). Если выделение памяти не удалось (то есть, если malloc вернул NULL), то ничего не делается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы