C не имеет null
, он имеет NULL
. Так что попробуйте это:
dict* NewDictionary(void) {
return calloc(sizeof(dict));
}
Это исправляет несколько проблем:
- Вы уезжали
value
и key
неинициализированный, чтобы они могли провести случайный мусор. Использование calloc()
будет инициализировать все до 0, что в контексте указателя NULL
. Это даже не займет столько времени обработки.
- Вы ничего не возвращали. Это неопределенное поведение. Если вы заканчиваете работу без инструкции
return
, то только благодаря удачи все будет возвращено.
- Вы использовали
dict_pair
вместо struct dict_pair
. В C++ имена struct
находятся в обычном пространстве имен типов, то есть t x = { 0 };
действителен C++, но в C вам необходимо указать struct t x = { 0 };
.
- Вы не проверяли возвращаемое значение
malloc()
(сейчас calloc()
, но применяются те же правила). Если памяти недостаточно, calloc()
возвращает NULL
. Мне не хотелось бы разыгрывать указатель NULL
на случай аварии. Нам не нужно проверять возвращаемое значение здесь, потому что я покончил со всеми промежуточными шагами - для нас достаточно calloc()
.
Отметьте, что calloc()
немного менее портативен. Несмотря на то, что стандарт требует, чтобы void *p = 0
устанавливает указатель на нулевой указатель, он не требует, чтобы нулевой указатель был «все биты установлены на ноль», что технически делает calloc()
.Если вы не хотите использовать calloc()
по этой причине, вот версия, которая делает то же самое с malloc()
:
dict* NewDictionary(void) {
dict *dictionary = malloc(sizeof(dict));
if(dictionary) {
dictionary->head = NULL;
dictionary->tail = NULL;
dictionary->value = NULL;
dictionary->key = NULL;
}
return dictionary;
}
Или:
dict* NewDictionary(void) {
dict *dictionary = malloc(sizeof(dict));
if(dictionary == NULL) return NULL;
dictionary->head = NULL;
dictionary->tail = NULL;
dictionary->value = NULL;
dictionary->key = NULL;
return dictionary;
}
Посмотрите, как гораздо лучше, версия calloc()
это?
Что касается Вашего второго вопроса:
Кроме того, я могу рекурсивно объявить обратитесь же структура внутри структуры?
Нет, вы не можете сделать это:
struct t {
struct t x;
}
Но вы можете сделать это (то, что вы делаете, и то, что вы хотите):
struct t {
struct t *x;
}
У вас может быть указатель на struct
внутри самого struct
, но у вас не может быть фактического struct
внутри struct
себя. То, что вы делаете, совершенно законно, потому что вы используете указатели.
Используйте 'NULL' вместо' null'. 'null' не является частью C. –
напишите как ответ, я хочу дать вам реквизиты для него. – nubela
Подождите ... так что проблема в том, что «null» не был распознан? то да, вместо ответа вместо этого используется «NULL». Или 0, если NULL не будет определено в вашей среде разработчиков, что редко бывает в наши дни, но все же возможно. – Randolpho