Задача инициализации структуры в C - PullRequest
1 голос
/ 07 августа 2010

Я пишу программу для "Set" структуры данных в C.

Работает нормально, когда присутствует один экземпляр Set, но не работает, когда присутствуют два экземпляра Set.

Также мой код для удаления элемента не работает, когда кандидат является первым элементом.

Может ли кто-нибудь мне помочь?

Вот код:

Ответы [ 2 ]

5 голосов
/ 07 августа 2010

Прежде всего, вы передаете указатель для установки по значению. То есть вместо

void Set_Create (Set* set) {
     set = malloc(...); // Malloc here leads to memory-leak.
     //...
}

int main() {
     Set *set; // Some value like 0xdeadbeef pointing somewhere
     Set_Create (set);
     // set have still undefined value
}

использование

Set *Set_Create () {
     Set *set = malloc(...);
     /// ...
     return set;
}

int main() {
     Set *set; // Some value like 0xdeadbeef pointing somewhere
     set = Set_Create ();
     // set point to new memory
}

или

void Set_Create (Set *set) {
     // No malloc
     /// ...
     return set;
}

int main() {
     Set set; // Create on stack
     Set_Create (&set); // Initialize
     // ...
}

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

4 голосов
/ 07 августа 2010

Я подозреваю, что вы просите нас помочь вам с домашним заданием, поэтому я не собираюсь решать все ваши проблемы с кодом для вас. Я лишь укажу на вашу самую вопиющую ошибку. Это ошибка, о которой вы спрашивали - почему происходит сбой второго вызова вашей create_Set() функции?

test.c, строки 27-28:

   Set* s2;
   Set_Create(s2); //.. Here error comes..

В set.c я урезал его до значимого кода:

void Set_Create(Set* set){
   if(set == NULL){
       set = (Set *)malloc(sizeof(Set));
   }

   set->size = 0;
   set->data = -1;
   set->next = NULL;
}

Происходит то, что оба ваших вызовов на Set_Create перезаписывают некоторые произвольные, непредсказуемые области памяти. Это серьезная ошибка.

В случае set1 произвольный указатель, с которым вы столкнулись, похоже, указывает на какое-то место в памяти, в которое можно записать. Кто знает, какие данные вы используете, но ваши данные могут выжить в этом месте в течение короткого периода времени.

В случае set2 произвольный указатель, с которым вы сталкиваетесь, является , а не допустимой ячейкой памяти, которую вы хотите изменить, поэтому ваша программа падает.

Измените create_Set следующим образом:

Set* Set_Create() {
   Set * set = calloc(1, sizeof(Set));

   set->data = -1;
   return set;
}

И в test.c:

Set * set1 = Set_Create();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...