С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
rrrruuuu
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 3
1

Структуры - ошибка доступа к памяти

26.01.2011, 02:55. Просмотров 646. Ответов 4
Метки нет (Все метки)

Вроде все написано правильно, но компилер ругается при попытке создать второй елемент...
Попрошу не пугатся немецкого, имена функций все же на англиском, заранее спасибо.
Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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);           
}
Добавлено через 28 минут
не компилер, а линукс ругается, ошибка доступа к памяти...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2011, 02:55
Ответы с готовыми решениями:

Ошибка доступа к памяти при работе со структурами
Задача состоит следующая создать динамический массив. Т.е кол-во элементов в...

Очистка памяти от структуры
Есть структура бинарного дерева: struct Node { char name; struct Node...

Структуры и связные списки. Нарушение прав доступа при записи
исполняемый файл запускаеться , а когда начинаю вводить данные с клавиатуры...

Выделение памяти под структуры (malloc)
Доброго времени суток! Нужна помощь в выделении памяти для структуры с...

Динамическое выделение памяти под структуры
Такая ситуация. Необходимо написать функцию ввода структуры c консоли void...

4
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
26.01.2011, 02:57 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
        if((ptr->next=(struct listElem*)malloc(sizeof(*ptr)))!=NULL) {
            next->key=k;
            ptr->next=NULL;
        }
выделил в ptr->next, а потом обнулил его же

C
1
2
3
4
        if ((ptr->next = (struct listElem*) malloc(sizeof(*ptr))) != NULL) {
            ptr->next->key = k;
            ptr->next->next = NULL;
        }
1
rrrruuuu
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 3
26.01.2011, 03:29  [ТС] 3
Спасибо огромное друг!! Все понял тепер...

Добавлено через 7 минут
Тогда почему здесь работает?
Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include<stdlib.h>
#include <stdio.h>
#include<string.h>     
      struct s_Kundenkarte
      {
         char VName[50+1];
         char NName[50+1];
         char Geburtstag[10+1];
         int Alter;
         struct s_Kundenkarte* next;
     };
    
     struct s_Kundenkarte* first;
    
     /*-------------------------------------------------------------------------*/
    
     void Anheangen( char VName[], char NName[], char Geburtstag[], int Alter );
     void Ausgeben();
     void Loeschen( char VName[] );
    
     /*-------------------------------------------------------------------------*/
    
     void Anhaengen( char VName[], char NName[], char Geburtstag[], int Alter )
     {
        struct s_Kundenkarte* ptr;
    
        if( first == NULL )
        {
           first = malloc( sizeof( *first ) );
    
           strcpy( first->VName, VName );
           strcpy( first->NName, NName );
           strcpy( first->Geburtstag, Geburtstag );
           first->Alter = Alter;
    
           first->next = NULL;
        }
    
        else
        {
           ptr = first;
    
           while( ptr->next != NULL )
              ptr = ptr->next;
    
           ptr->next = malloc( sizeof( *ptr ) );
    
           ptr = ptr->next;
    
           strcpy( ptr->VName, VName );
           strcpy( ptr->NName, NName );
           strcpy( ptr->Geburtstag, Geburtstag );
           ptr->Alter = Alter;
    
           ptr->next = NULL;
        }
     }
    
     /*-------------------------------------------------------------------------*/
    
     void Ausgeben()
     {
        struct s_Kundenkarte* ptr;
    
        ptr = first;
    
        printf( "\n" );
    
        while( ptr != NULL )
        {
    
           printf( "%s %s %s %d\n", ptr->VName, ptr->NName,
                                    ptr->Geburtstag, ptr->Alter );
    
           ptr = ptr->next;
        }
    
        printf( "\n" );
     }
    
     /*-------------------------------------------------------------------------*/
    
     void Loeschen( char VName[] )
     {
        struct s_Kundenkarte* ptr, * ptrA;
    
        if( first != NULL )
        {
           if( strcmp( first->VName, VName ) == 0 )
           {
             ptr = first->next;
    
              free( first );
    
              first = ptr;
           }
    
           else
           {
             ptr = first;
   
             while( ptr->next != NULL )
             {
                ptrA = ptr->next;
   
                if( strcmp( ptrA->VName, VName ) == 0 )
                {
                   ptr->next = ptrA->next;
                   free( ptrA );
   
                   break;
                }
   
                ptr = ptrA;
             }
          }
       }
    }
   
    /*-------------------------------------------------------------------------*/
   
    int main( void )
    {
       char VName[] = "Benno", NName[] = "Mielke", Geburtstag[] = "15.02.1984";
       int  Alter = 18;
   
       Anhaengen( VName, NName, Geburtstag, Alter );
       Anhaengen( "Steve", "Nitzschke", "27.12.1983", 19 );
   
       Ausgeben();
   
       Loeschen( "Steve" );
   
       Ausgeben();
   
      return( 0 );
    }
0
accept
4833 / 3255 / 463
Регистрация: 10.12.2008
Сообщений: 10,569
26.01.2011, 03:40 4
C
1
2
        ptr->next = malloc( sizeof( *ptr ) );
        ptr = ptr->next;
потому что переводится указатель, сначала для нового узла выделили, прицепив его к последнему, а потом указатель перевели на него и уже указатель указывает на новый узел
0
rrrruuuu
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 3
26.01.2011, 03:47  [ТС] 5
Спасибо... невнимателен я .
0
26.01.2011, 03:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2011, 03:47

Структуры. Объем занимаемой памяти. Небольшие странности в арифметике
Вот имеется у меня такой код #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; struct...

"Файлы и структуры" Заполнить файл последовательного доступа N действительными числами
Здравствуйте) Требуется помощь в написании программы, не смог разобраться с...

Нарушение прав доступа при записи по адресу 0х00000000 при добавлении элемента структуры
прошу помощи, выбивает эту ошибку при добавлении элемента структуры, также...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru